POJ 2263 Heavy Cargo解题代码(SPFA)

看了网上很多都用Dijstra或者是Floyd算法解答的,于是自己就用SPFA解试了一下,一下AC过,虽然时间47ms;

运用dist[v]=max(dist[v],min(dist[u],edge[u][v]));

代码如下:

  1 #include<iostream>
  2 #include<cstring>
  3 #include<cstdio> 
  4 #include<queue> 
  5 using namespace std;
  6 #define INF 200000
  7 #define MAXN 201
  8 
  9 struct node
 10 {
 11         int to;
 12         int w;
 13         node *next;    
 14 };
 15 
 16 node* edge[MAXN];
 17 int dist[MAXN];
 18 int vis[MAXN];
 19 int index;
 20 char name[MAXN][50]; 
 21 int n,r; 
 22 int search(char name1[])
 23 {
 24     int i;
 25     for(i=1; i<=index; i++)
 26         if(strcmp(name1, name[i])==0)
 27             return i;
 28     strcpy(name[++index], name1);  
 29     return index;
 30 }
 31 
 32 void SPFA(int st)
 33 {
 34     memset(vis,0,sizeof(vis));
 35     int u; 
 36     for(int i=1;i<=n;i++)
 37     {
 38         dist[i]=INF;
 39         vis[i]=0;    
 40     }
 41  queue<int> q;
 42  q.push(st);
 43  vis[st]=1;
 44  node * temp;
 45  while(!q.empty())
 46 {
 47         u=q.front();
 48         q.pop();
 49         vis[u]=0;
 50         temp=edge[u];
 51         while(temp!=NULL)
 52         {
 53                 int v=temp->to;
 54                 if(dist[v]!=INF&&dist[v]<min(dist[u],temp->w))
 55                 {
 56                     dist[v]=min(dist[u],temp->w);
 57                     if(!vis[v])
 58                     {
 59                         q.push(v);
 60                         vis[v]++;    
 61                     }    
 62                 }
 63                 else
 64                 {
 65                     if(dist[v]==INF)
 66                     { 
 67                     dist[v]=min(dist[u],temp->w);
 68                     if(!vis[v])
 69                     {
 70                         q.push(v);
 71                         vis[v]++;    
 72                     }
 73                     }        
 74                 }
 75                 
 76                 temp=temp->next;    
 77         }        
 78 }    
 79 } 
 80 
 81 int main()
 82 {
 83     char a[50],b[50];
 84     int weight;
 85     int k=0; 
 86     while(scanf("%d%d",&n,&r)!=EOF,n+r)
 87     {
 88         memset(edge,0,sizeof(edge)); 
 89         node * temp;
 90         index=0; 
 91             for(int i=0;i<r;i++)
 92             {
 93                 scanf("%s %s %d",a,b,&weight);
 94                 int x=search(a),y=search(b);
 95                 temp=new node;
 96                 temp->to=y;
 97                 temp->w=weight;
 98                 temp->next=NULL;
 99                 if(edge[x]==NULL) edge[x]=temp;
100                 else
101                 {
102                         temp->next=edge[x];
103                         edge[x]=temp;    
104                 } 
105                 temp=new node;
106                 temp->to=x;
107                 temp->w=weight;
108                 temp->next=NULL;
109                 if(edge[y]==NULL) edge[y]=temp;
110                 else
111                 {
112                         temp->next=edge[y];
113                         edge[y]=temp;    
114                 }              
115             }
116             scanf("%s %s",a,b);
117             int st=search(a);
118             int ed=search(b);
119             SPFA(st);
120          
121             printf("Scenario #%d\n",++k); 
122             printf("%d tons\n",dist[ed]);
123             printf("\n"); 
124     } 
125     return 0;    
126 } 

 

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

导航