POJ_3268_Sliver Cow Party结题报告

两次运用SPFA算法求最短路,所用的地图是相互反向的,采用的是邻接表表示

  1 #include<iostream>
  2 using namespace std;
  3 #include<queue>
  4 #include<cstdio>
  5 #include<cstring>
  6 #define INF 20000000
  7 #define MAXN 1010 
  8 struct node
  9 {
 10         int to;
 11         int w;
 12         node * next;    
 13 };
 14 
 15 node * edge1[MAXN];
 16 node * edge2[MAXN];
 17 int vis[MAXN];
 18 int dist1[MAXN];
 19 int dist2[MAXN];
 20 int N,M,X;
 21 void SPFA(int x,int dist[],node *edge[]) 
 22 {
 23         int u;
 24         node *temp; 
 25         for(int i=1;i<=N;i++)
 26         {
 27                 dist[i]=INF;
 28                 vis[i]=0;    
 29         }
 30         queue<int> q;
 31         dist[x]=0;
 32         q.push(x);
 33         while(!q.empty())
 34         {
 35             u=q.front();
 36             q.pop();
 37             vis[u]=0; 
 38             temp=edge[u];
 39             while(temp!=NULL)
 40             {
 41                 int v=temp->to;
 42                 if(dist[v]>dist[u]+temp->w)
 43                 {
 44                         dist[v]=dist[u]+temp->w;
 45                         if(!vis[v])
 46                         {
 47                             q.push(v);
 48                             vis[v]=1;    
 49                         }    
 50                 }
 51               temp=temp->next;    
 52             }    
 53         }                    
 54 } 
 55 int main()
 56 {
 57     while(scanf("%d%d%d",&N,&M,&X)!=EOF)
 58     { 
 59           int a,b,c;
 60           node * temp; 
 61           memset(edge1,0,sizeof(edge1));
 62           memset(edge2,0,sizeof(edge2));  
 63           for(int i=0;i<M;i++)
 64           {
 65             scanf("%d%d%d",&a,&b,&c);
 66             temp=new  node;
 67             temp->w=c;
 68             temp->to=b;
 69             temp->next=NULL;
 70             if(edge1[a]==NULL) edge1[a]=temp;
 71             else
 72             {
 73                     temp->next=edge1[a];
 74                     edge1[a]=temp;    
 75             }
 76             temp=new  node;
 77             temp->w=c;
 78             temp->to=a;
 79             temp->next=NULL;
 80             if(edge2[b]==NULL) edge2[b]=temp;
 81             else
 82             {
 83                     temp->next=edge2[b];
 84                     edge2[b]=temp;    
 85             }
 86                 
 87     } 
 88     SPFA(X,dist1,edge1); 
 89     SPFA(X,dist2,edge2); 
 90     int max=0;  
 91     for(int i=1;i<=N;i++)  
 92       {  
 93            if(max<dist1[i]+dist2[i])  
 94           {  
 95               max=dist1[i]+dist2[i];  
 96         }    
 97       }  
 98             printf("%d\n",max);  
 99             
100 } 
101     return 0;    
102 } 

 

posted on 2012-08-10 14:56  我的ACM之路  阅读(182)  评论(0编辑  收藏  举报

导航