HDU 2112 today(dij)
阿新 • • 發佈:2018-12-16
#include <stdio.h> #include <iostream> #include <cstring> #include <algorithm> #include <map> using namespace std; #define inf 0x3f3f3f3f int cast[205], vis[205], cnt; int a[205][205]; void Dijkstra(int s,int e) { int i, j, min ,pos; memset(vis,0,sizeof(vis)); for(i = s; i <= e; i++) cast[i] = (i == s ? 0 : inf); for(i = s; i <= e; i++) { min = inf; for(j = s; j <= e; j++) { if(cast[j] < min && !vis[j]) { pos = j; min = cast[j]; } } vis[pos] = 1; if(min == inf) break; for(j = s; j <= e; j++) { if(cast[pos]+a[pos][j] < cast[j] && !vis[j]) cast[j] = cast[pos]+a[pos][j]; } } } int main() { //freopen("data.in", "r", stdin); map<string,int> mat;//在這裡mat的作用是將字串化為整數儲存,然後進行dijkstra就可以解決問題 char s1[100], s2[100]; int i, cnt, flag,n,j; while(~scanf("%d",&n) && n>0) { mat.clear(); memset(a, inf, sizeof(a)); flag = 0; scanf("%s%s", s1, s2); if(!strcmp(s1, s2)) flag = 1; mat[s1] = 1; mat[s2] = 2; cnt = 3; for(i = 0; i<n; i++) { int k; scanf("%s%s%d", s1, s2, &k); if(!mat[s1]) mat[s1] = cnt++; if(!mat[s2]) mat[s2] = cnt++; if(k < a[mat[s1]][mat[s2]]) a[mat[s1]][mat[s2]] = a[mat[s2]][mat[s1]] = k; } if(flag) { printf("0\n"); continue; } Dijkstra(1, cnt-1); printf("%d\n",cast[2] == inf ? -1: cast[2]); } return 0; }