spfa求最短路
1 //vector算法 2 #include <iostream> 3 #include <cstdio> 4 #include <vector> 5 #include <queue> 6 #include <cstring> 7 using namespace std; 8 const int N = 100+10; 9 const int INF = 1<<27; 10 struct node { 11 int v,w; 12 }; 13 vector<node> vg[N]; 14 int dis[N]; 15 bool vis[N]; 16 int n,m; 17 bool relax(int u,int v,int w) 18 { 19 if(dis[v]>dis[u]+w) 20 { 21 dis[v]=dis[u]+w; 22 return 1; 23 } 24 return 0; 25 } 26 bool spfa(int s) 27 { 28 int i; 29 for(i=0;i<=n;i++) 30 { 31 vis[i]=0; 32 dis[i]=INF; 33 } 34 queue<int> q; 35 q.push(s);vis[s]=1; 36 dis[s]=0; 37 while(!q.empty()) 38 { 39 int u=q.front();q.pop();vis[u]=0; 40 for(i=0;i<vg[u].size();i++) 41 { 42 node vnd=vg[u][i]; 43 int v=vnd.v; 44 int w=vnd.w; 45 if(relax(u,v,w)&&!vis[v]) 46 { 47 vis[v]=1; 48 q.push(v); 49 } 50 } 51 } 52 return 1; 53 } 54 int main() 55 { 56 int u,v,w,i; 57 while(scanf("%d%d",&n,&m)&&(n+m)) 58 { 59 for(i=0;i<=n;i++) vg[i].clear();//注意初始化 60 for(i=0;i<m;i++) 61 { 62 node nd; 63 scanf("%d%d%d",&u,&v,&w); 64 nd.v=v;nd.w=w; 65 vg[u].push_back(nd); 66 nd.v=u; 67 vg[v].push_back(nd); 68 } 69 spfa(1); 70 cout<<dis[n]<<endl; 71 } 72 return 0; 73 }
//一般法
1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 using namespace std; 5 int N, max_n ,min_n; 6 const int MAXN = 50010 ; 7 struct node{ 8 int nx ,num , dis ; 9 }edge[MAXN*4]; 10 11 int root[MAXN] , cnt ; 12 void add(int a,int b, int c){ 13 edge[cnt].num = b ; 14 edge[cnt].nx = root[a] ; 15 edge[cnt].dis = c ; 16 root[a] = cnt++ ; 17 } 18 int dis[MAXN] ; 19 bool vis[MAXN] ; 20 bool relax(int u ,int v,int d){ 21 if( dis[v] < dis[u] + d){ 22 dis[v] = dis[u] + d; 23 return 1; 24 } 25 return 0 ; 26 } 27 void spfa(){ 28 for(int i=min_n ;i<=max_n;i++){ 29 vis[i] = 0 ; 30 dis[i] = -MAXN ; 31 } 32 queue<int> que ; 33 while(!que.empty()) que.pop() ; 34 que.push(min_n); 35 vis[min_n] = 1; 36 dis[min_n] = 0 ; 37 while(!que.empty()){ 38 int u = que.front() ; 39 que.pop() ; vis[u] = 0 ; 40 for(int i=root[u] ;i!=-1; i=edge[i].nx){ 41 int v = edge[i].num ; 42 int d = edge[i].dis ; 43 if( 1==relax(u,v,d) && !vis[v]){ 44 vis[v] = 1; 45 que.push(v); 46 } 47 } 48 } 49 printf("%d\n",dis[n]); 50 } 51 int main(){ 52 int a, b,c ; 53 while(scanf("%d%d",&n,&m)&&(n+m)){ 54 memset(root , -1 ,sizeof(root)); 55 cnt = 0 ; 56 for(int i=1;i<=m;i++) 57 { 58 scanf("%d %d %d",&a,&b,&c); 59 add(a, b, c); 60 } 61 spfa() ; 62 } 63 return 0 ; 64 }