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 }

 

posted @ 2012-07-14 19:40  qijinbiao1  阅读(143)  评论(0编辑  收藏  举报