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 }