分析:模版题,直接套用模版即可。
#include<iostream> #include<queue> using namespace std; int u[2002]; int v[2002]; int w[2002]; bool vis[202]; int d[202]; int first[202]; int Next[2002]; void Init(int n,int m) { int i; for(i=0;i<n;i++) { vis[i]=false; first[i]=-1; } for(i=0;i<m;i++) Next[i]=-1; } void spfa(int n,int s) //flag表示当前处理的是反向建立后的图还是一开始的图,false反向,true开始 { queue<int> q; int i,x,y; for(i=0;i<n;i++) d[i]=(i==s)?0:0x7fffffff; //初始化,自己到自己为0,其他到自己相当于无穷大 q.push(s); while(!q.empty()) { x=q.front(); q.pop(); vis[x]=false; for(i=first[x];i!=-1;i=Next[i]) { y=v[i]; if(d[y]>d[x]+w[i]) { d[y]=d[x]+w[i]; if(!vis[y]) { vis[y]=true; q.push(y); } } } } } void Read(int m) { int i,a,b; for(i=0;i<m;i++) { scanf("%d %d %d",&a,&b,&w[i]); u[i]=a; //存储正向边,因为是无向图 v[i]=b; Next[i]=first[a]; first[a]=i; w[i+1]=w[i]; //存储反向边 i++; u[i]=b; v[i]=a; Next[i]=first[b]; first[b]=i; } } void Output(int t) { if(d[t]==0x7fffffff) puts("-1"); else printf("%d\n",d[t]); } int main() { int n,m; int s,t; while(scanf("%d %d",&n,&m)==2) { Init(n,m+m); //m+m是因为无向边,每条都要保存两条 Read(m+m); scanf("%d %d",&s,&t); spfa(n,s); Output(t); } return 0; }
时间: 2024-10-03 13:48:47