标签:
http://poj.org/problem?id=2240
题意:现你有N种货币,在进行货币进行兑换后,最终仍需兑换成原本货币,若其中某一种货币增加了,就输出“Yes”,否则输出“No”.
一开始TLE了, 因为 return 1 的位置放错了。。 一开始没咋想,直接放到最后判断了。。。
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <cstdlib> #include <cstring> #include <map> #include <queue> using namespace std; #define maxn 150 #define INF 0x3f3f3f3f int head[maxn], v[maxn]; double dist[maxn]; int cnt; struct node { int u, v, next; double w; } maps[maxn]; void Add(int u, int v, double w) { maps[cnt].v = v; maps[cnt].w = w; maps[cnt].next = head[u]; head[u] = cnt ++; } int spfa(int s) { memset(v, 0, sizeof(v)); queue<int>Q; Q.push(s); v[s] = 1; while(Q.size()) { int p=Q.front(); Q.pop(); v[p] = 0; for(int i=head[p]; i!=-1; i=maps[i].next) { int q = maps[i].v; double t = dist[p]*maps[i].w; if(dist[q]<t) { dist[q] = t; if(!v[q]) { v[q] = 1; Q.push(q); } } } if(dist[s] > 1) return 1; } return 0; } int main() { int n, m, t=1; char str[50]; while(scanf("%d", &n), n) { map<string, int>s; s.clear(); for(int i=1; i<=n; i++) { scanf("%s", str); s[str] = i; } scanf("%d", &m); char a[50], b[50]; double c; cnt = 0; memset(head, -1, sizeof(head)); for(int i=1; i<=m; i++) { scanf("%s %lf %s", a, &c, b); Add(s[a], s[b], c); } int ans = 0; for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) dist[j] = - INF; dist[i] = 1; ans += spfa(i); if(ans) break; } if(ans) printf("Case %d: Yes\n", t++); else printf("Case %d: No\n", t++); } return 0; }
标签:
原文地址:http://www.cnblogs.com/daydayupacm/p/5704375.html