hdu 1217最短路(bellmanFord)

/* Name: 最短路(bellmanFord) Copyright: Author: Try86 Date: 18/04/12 13:50 Description: 判断是否从某一种货币出发经过一系列的转换后回到自身时,货币币值增加 */ #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> using namespace std; const int N = 35; const int M = 1000; double d[N]; char names[N][N], str1[N], str2[N]; struct edge { int u; int v; double w; }e[M]; int cmp(const void *a, const void *b) { return strcmp((char *)a, (char *)b); } int binarySearch(char *str, int n) { int left = 0; int right = n; while (left <= right) { int mid = (left + right) / 2; if (!strcmp(names[mid], str)) return mid; else if (strcmp(names[mid], str) > 0) right = mid - 1; else left = mid + 1; } } void relax(int u, int v, double w) {//松弛,权值相乘 if (d[v] < d[u]*w) d[v] = d[u] * w; return ; } bool bellmanFord(int m, int n, int s) { memset(d, 0, sizeof(d));//初始化 d[s] = 1; for (int i=0; i<n; ++i) { for (int j=0; j<m; ++j) { relax(e[j].u, e[j].v, e[j].w); } } return d[s] > 1.0;//判断转换后币值是否增加 } int main() { int n, t = 0; double w; while (scanf("%d", &n), n) { for (int i=0; i<n; ++i) scanf ("%s", names[i]); qsort(names, n, sizeof(names[0]), cmp); int m; scanf ("%d", &m); for (int i=0; i<m; ++i) { scanf ("%s%lf%s", str1, &w, str2); int u = binarySearch(str1, n); int v = binarySearch(str2, n); e[i].u = u, e[i].v = v, e[i].w = w; } bool flag; for (int i=0; i<n; ++i) {//以每种货币为源点,进行最短路操作 flag = bellmanFord(m, n, i); if (flag) break;//存在符合条件的货币,退出 } if (flag) printf ("Case %d: Yes\n", ++t); else printf ("Case %d: No\n", ++t); } return 0; }