1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| #include<bits/stdc++.h> using namespace std; typedef long long ll; #define pb push_back #define rep(i,a,b) for(int i=a,i##end=b;i<=i##end;++i)
char IO; int rd(){ int s=0; while(!isdigit(IO=getchar())); do s=(s<<1)+(s<<3)+(IO^'0'); while(isdigit(IO=getchar())); return s; }
const int N=5e5+10,INF=1e9+10;
int n,m,k; struct Edge{ int v,c,w; }; vector <Edge> G[N]; int U[N],V[N],C[N],W[N];
struct Node{ int u; ll d; bool operator < (const Node __) const { return d>__.d; } }; priority_queue <Node> que; ll dis[N],S[N]; void Upd(int u,ll d){ if(dis[u]<=d) return; dis[u]=d,que.push((Node){u,d}); } map <int,int> st[N]; void AddEdge(int u,int v,int c,int w){ if(!st[u].count(c)) { st[u][c]=++k; G[u].pb((Edge){k,0,0}); } int t=st[u][c]; G[t].pb((Edge){v,c,w}),S[t]+=w; }
void Dijkstra(){ memset(dis,63,sizeof dis); dis[1]=0,que.push((Node){1,0}); while(!que.empty()) { int u=que.top().u; ll d=que.top().d; que.pop(); if(dis[u]<d) continue; if(u<=n) { for(Edge dd:G[u]) { int t=dd.v; for(Edge i:G[t]) { Upd(i.v,d+min((ll)i.w,S[t]-i.w)); Upd(st[i.v][i.c],d); } } } else for(Edge i:G[u]) Upd(i.v,d+S[u]-i.w); } printf("%lld\n",dis[n]<1e17?dis[n]:-1); }
int main(){ freopen("robot.in","r",stdin),freopen("robot.out","w",stdout); n=rd(),m=rd(),k=n; rep(i,1,m) { int u=rd(),v=rd(),c=rd(),w=rd(); AddEdge(u,v,c,w),AddEdge(v,u,c,w); } Dijkstra(); }
|