hdu 2112 最短路
本来是拿来复习一下map的,没想搞了半天,一直wa,最后发现预处理没有处理到所有的点
就是个最短路
Sample Input
6 xiasha westlake xiasha station 60 xiasha ShoppingCenterofHangZhou 30 station westlake 20 ShoppingCenterofHangZhou supermarket 10 xiasha supermarket 50 supermarket westlake 10 -1
Sample Output
50 Hint: The best route is: xiasha->ShoppingCenterofHangZhou->supermarket->westlake 虽然偶尔会迷路,但是因为有了你的帮助 **和**从此还是过上了幸福的生活。 ――全剧终――
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 const int maxint=9999999; 9 //printf("----\n"); 10 using namespace std; 11 int m,t; 12 int tot=0; 13 map<string,int> st; 14 int c[200][200],dist[200]; 15 void dijkstra(int u,int n) 16 { 17 //printf("%d\n",n); 18 bool vis[200]; 19 for(int i=1;i<=n;i++) 20 { 21 vis[i]=0; 22 dist[i]=c[u][i]; 23 } 24 vis[u]=1; 25 for(int i=2;i<=n;i++) 26 { 27 int temp=maxint; 28 int k=u; 29 for(int j=1;j<=n;j++) 30 { 31 if(!vis[j]&&dist[j]<temp) 32 { 33 temp=dist[j]; 34 k=j; 35 } 36 } 37 if(temp==maxint) break; 38 vis[k]=1; 39 for(int j=1;j<=n;j++) 40 { 41 if(!vis[j]&&c[k][j]<maxint) 42 { 43 if(dist[k]+c[k][j]<dist[j]) 44 dist[j]=dist[k]+c[k][j]; 45 } 46 } 47 } 48 } 49 int main() 50 { 51 int i,j,k,n; 52 //freopen("1.in","r",stdin); 53 while(scanf("%d",&n)!=EOF) 54 { 55 bool flag=0; 56 if(n==-1) break; 57 st.clear(); 58 char s[30],e[30]; 59 scanf("%s%s",s,e); 60 if(strcmp(s,e)==0) 61 { 62 flag=1; 63 } 64 st[s]=1; 65 st[e]=2; 66 tot=3; 67 for(i=1;i<=150;i++) 68 { 69 for(j=1;j<=150;j++) c[i][j]=c[j][i]=((i==j)?0:maxint); 70 } 71 for(i=1;i<=150;i++) 72 { 73 dist[i]=maxint; 74 } 75 for(i=1;i<=n;i++) 76 { 77 int w; 78 scanf("%s%s%d",s,e,&w); 79 if(!st[s]) st[s]=tot++; 80 if(!st[e]) st[e]=tot++; 81 c[st[s]][st[e]]=c[st[e]][st[s]]=w; 82 } 83 dijkstra(1,tot); 84 if(flag) printf("0\n"); 85 else if(dist[2]==maxint) printf("-1\n"); 86 else 87 printf("%d\n",dist[2]); 88 } 89 return 0; 90 }
2015-04-24:这个是kuangbin模板的,检测了一下,算法里的起点是从0开始的,那个优化代码不知道怎么就wa了,等刷到kuang大神的最短路再看吧
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 1000000007 10 const double eps=1e-5; 11 #define cl(a) memset(a,0,sizeof(a)) 12 #define ts printf("*****\n"); 13 const int MAXN=1005; 14 int n,m,tt; 15 #define typec int 16 const typec INF=9999999;//防止后面溢出,这个不能太大 17 int c[MAXN][MAXN],tot=0,dist[200]; 18 bool vis[MAXN]; 19 int pre[MAXN]; 20 void Dijkstra(typec cost[][MAXN],typec lowcost[],int n,int beg) 21 { 22 for(int i=0;i<=n;i++) 23 { 24 lowcost[i]=INF;vis[i]=false;pre[i]=-1; 25 } 26 lowcost[beg]=0; 27 for(int j=0;j<n;j++) 28 { 29 int k=-1; 30 int Min=INF; 31 for(int i=1;i<=n;i++) 32 if(!vis[i]&&lowcost[i]<Min) 33 { 34 Min=lowcost[i]; 35 k=i; 36 } 37 if(k==-1)break; 38 vis[k]=true; 39 for(int i=1;i<=n;i++) 40 if(!vis[i]&&lowcost[k]+cost[k][i]<lowcost[i]) 41 { 42 lowcost[i]=lowcost[k]+cost[k][i]; 43 pre[i]=k; 44 } 45 } 46 } 47 map<string,int> st; 48 int main() 49 { 50 int i,j,k; 51 #ifndef ONLINE_JUDGE 52 freopen("1.in","r",stdin); 53 #endif 54 while(scanf("%d",&n)!=EOF) 55 { 56 bool flag=0; 57 if(n==-1) break; 58 st.clear(); 59 char s[30],e[30]; 60 scanf("%s%s",s,e); 61 if(strcmp(s,e)==0) 62 { 63 flag=1; 64 } 65 st[s]=1; 66 st[e]=2; 67 tot=3; 68 for(i=1;i<=150;i++) 69 { 70 for(j=1;j<=150;j++) c[i][j]=c[j][i]=((i==j)?0:INF); 71 } 72 for(i=1;i<=150;i++) 73 { 74 dist[i]=INF; 75 } 76 for(i=1;i<=n;i++) 77 { 78 int w; 79 scanf("%s%s%d",s,e,&w); 80 if(!st[s]) st[s]=tot++; 81 if(!st[e]) st[e]=tot++; 82 c[st[s]][st[e]]=c[st[e]][st[s]]=w; 83 } 84 Dijkstra(c,dist,tot,1); 85 if(flag) printf("0\n"); 86 else if(dist[2]==INF) printf("-1\n"); 87 else 88 printf("%d\n",dist[2]); 89 } 90 }