hdu2112HDU Today
来源:互联网 发布:js怎么查看对象的内容 编辑:程序博客网 时间:2024/04/29 19:50
#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<map>#include<algorithm>using namespace std;#define INF 0x3f3f3f3f#define Max 155int dis[Max], res[Max][Max];bool visit[Max];void Dijkstra(int start, int end){ int temp, k; memset(visit, false, sizeof(visit)); for(int i = 1; i <= end; ++i) dis[i] = res[start][i]; dis[start] = 0; visit[start] = 1; for(int i = 1; i <= end; ++i) { temp = INF; for(int j = 1; j <= end; ++j) if(!visit[j] && temp > dis[j]) temp = dis[k = j]; if(temp == INF) break; visit[k] = 1; for(int j = 1; j <= end; ++j) if(!visit[j] && dis[j] > dis[k] + res[k][j]) dis[j] = dis[k] + res[k][j]; }}int main(){ int num, count; char s[32], e[32]; bool flag; char str[32], str1[32]; int cost; map<string, int>car; while(scanf("%d", &num) != EOF && num != -1) { flag = 0; car.clear(); memset(res, INF, sizeof(res)); count = 3; scanf("%s%s", s, e); if(strcmp(s, e) == 0) flag = 1; car[s] = 1; car[e] = 2; for(int i = 1; i <= num; ++i) { scanf("%s%s%d", str, str1, &cost); if(!car[str]) car[str] = count++; if(!car[str1]) car[str1] = count++; if(cost < res[car[str]][car[str1]]) //注意: 再输入两边和对应权值时, 一定要判断当前权值是否小于输入 //权值,后选择是否更新, 不然WA; res[car[str]][car[str1]] = res[car[str1]][car[str]] = cost; } if(flag) //剪枝, 防止无谓的用时; { printf("0\n"); continue; } Dijkstra(1, count - 1);//此处应用 count -1; 为此错了好几次 if(dis[2] == INF) printf("-1\n"); else printf("%d\n", dis[2]); } return 0;}