标签:mes guide dde str size front push usaco 最短路
常规最短路,和USACO重题
#include<bits/stdc++.h> using namespace std; int n,m,a,b,c,d,ne,head[501000],head2[501000],vis[501000],dis[501000]; struct node{int nxt,to,from,d1,d2;}eg[501000]; struct nd{int nxt,to,dis;}eg2[501000]; void adde(int u,int v,int v1,int v2) { eg[++ne].d1=v1;eg[ne].d2=v2;eg[ne].from=u;eg[ne].to=v;eg[ne].nxt=head[u]; head[u]=ne;eg2[ne].nxt=head2[v];eg2[ne].to=u; head2[v]=ne; } void spfa(int sart) { queue<int>q; memset(dis,0x3f,sizeof(dis)); dis[sart]=0; vis[sart]=1; q.push(sart); while(!q.empty()) { int u=q.front(); q.pop(); vis[u]=0; for(int i=head[u];i;i=eg[i].nxt) { int v=eg[i].to; if(dis[v]>dis[u]+eg[i].d1){ dis[v]=dis[u]+eg[i].d1; if(!vis[v]){vis[v]=1;q.push(v);} } } } for(int i=1;i<=m;i++) if(dis[eg[i].to]!=dis[eg[i].from]+eg[i].d1)eg2[i].dis++; memset(dis,0x3f,sizeof(dis)); dis[sart]=0; vis[sart]=1; q.push(sart); while(!q.empty()) { int u=q.front(); q.pop(); vis[u]=0; for(int i=head[u];i;i=eg[i].nxt) { int v=eg[i].to; if(dis[v]>dis[u]+eg[i].d2){ dis[v]=dis[u]+eg[i].d2; if(!vis[v]){vis[v]=1;q.push(v);} } } } for(int i=1;i<=m;i++) if(dis[eg[i].to]!=dis[eg[i].from]+eg[i].d2)eg2[i].dis++; } void spfa2(int sart) { queue<int>q; memset(dis,0x3f,sizeof(dis)); dis[sart]=0; vis[sart]=1; q.push(sart); while(!q.empty()) { int u=q.front(); q.pop(); vis[u]=0; for(int i=head2[u];i;i=eg2[i].nxt) { int v=eg2[i].to; if(dis[v]>dis[u]+eg2[i].dis){ dis[v]=dis[u]+eg2[i].dis; if(!vis[v]){vis[v]=1;q.push(v);} } } } } int main() { cin>>n>>m; for(int i=1;i<=m;i++) { cin>>a>>b>>c>>d; adde(b,a,c,d); } spfa(n); spfa2(1); cout<<dis[n]; }
标签:mes guide dde str size front push usaco 最短路
原文地址:https://www.cnblogs.com/SFWR-YOU/p/11626656.html