#include <cstdio> #include <cstring> #include <iostream> #include <queue> using namespace std; const int inf=0x3f3f3f3f; int n,m,k=1; int head[30000+10]; int vis[30000+10]; int dis[30000+10]; struct edge { int v,w,next; }e[300000+10]; void adde(int u,int v,int w) { e[k].v=v; e[k].w=w; e[k].next=head[u]; head[u]=k++; } void readdata() { memset(head,-1,sizeof(head)); memset(dis,inf,sizeof(dis)); int a,b,c; scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { scanf("%d%d%d",&a,&b,&c); adde(a,b,c); //adde(b,a,c); } } void dijkstra() { typedef pair <int,int >pii; priority_queue<pii,vector<pii>,greater<pii> >q; dis[1]=0; q.push(make_pair(dis[1],1)); while(!q.empty()) { int u=q.top().second; q.pop(); if(vis[u])continue; vis[u]=1; for(int i=head[u];i!=-1;i=e[i].next) { int v=e[i].v; if(dis[v]>dis[u]+e[i].w) { dis[v]=dis[u]+e[i].w; q.push(make_pair(dis[v],v)); } } } printf("%d ",dis[n]); } void spfa() { queue<int >q; dis[1]=0; q.push(1); vis[1]=1; while(!q.empty()) { int u=q.front(); q.pop(); vis[u]=0; for(int i=head[u];i!=-1;i=e[i].next) { int v=e[i].v; if(dis[v]>dis[u]+e[i].w) { dis[v]=dis[u]+e[i].w; if(!vis[v]) { q.push(v); vis[v]=1; } } } } printf("%d ",dis[n]); } int main() { freopen("1.in","r",stdin); freopen("1.out","w",stdout); readdata(); //dijkstra(); spfa(); return 0; }
关于spfa,它死了。