萌新30pts代码求条玄关
查看原帖
萌新30pts代码求条玄关
1660231
Little_d楼主2025/8/2 09:36
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
struct edge{
    int u,v,p,q;
}a[50005];
struct node{
    int v,w;
    bool operator<(const node &b)const{
        return b.w<w;
    }
};
priority_queue<node>q;
vector<node>e[10005];
int dis1[10005];
int dis2[10005];
int dis3[10005];
int vis[10005];
void dij(int s,int dis[]){
    for(int i=1;i<=n;i++)dis[i]=INT_MAX;
    memset(vis,0,sizeof(vis));
    dis[s]=0;
    q.push({s,0});
    while(!q.empty()){
        int u=q.top().v;
        q.pop();
        if(vis[u])continue;
        vis[u]=1;
        for(int i=0;i<e[u].size();i++){
            int v=e[u][i].v,w=e[u][i].w;
            if(dis[v]>dis[u]+w){
                dis[v]=dis[u]+w;
                q.push({v,dis[v]});
            }
        }
    }
    return;
}
signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        cin>>a[i].u>>a[i].v>>a[i].p>>a[i].q;
        e[a[i].v].push_back({a[i].u,a[i].p});
    }
    dij(1,dis1);
    for(int i=1;i<=n;i++)while(!e[i].empty())e[i].pop_back();
    for(int i=1;i<=m;i++)e[a[i].v].push_back({a[i].u,a[i].q});
    dij(1,dis2);
    for(int i=1;i<=n;i++)while(!e[i].empty())e[i].pop_back();
    for(int i=1;i<=m;i++){
        int cnt=0;
        if(dis1[a[i].v]-dis1[a[i].u]!=a[i].p)cnt++;
        if(dis2[a[i].v]-dis2[a[i].u]!=a[i].q)cnt++;
        e[a[i].u].push_back({a[i].v,cnt});
    }
    dij(1,dis3);
    cout<<dis3[n];
    return 0;
}
2025/8/2 09:36
加载中...