Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 15909 | Accepted: 6702 |
Description
Input
Output
Sample Input
3 USDollar BritishPound FrenchFranc 3 USDollar 0.5 BritishPound BritishPound 10.0 FrenchFranc FrenchFranc 0.21 USDollar 3 USDollar BritishPound FrenchFranc 6 USDollar 0.5 BritishPound USDollar 4.9 FrenchFranc BritishPound 10.0 FrenchFranc BritishPound 1.99 USDollar FrenchFranc 0.09 BritishPound FrenchFranc 0.19 USDollar 0
Sample Output
Case 1: Yes Case 2: No
这道题使用bellman-ford算最长路径,后台的测试数据极其坑爹啊,有A 10 A这种测试数据,对bellman-ford算法来说,根本无法更新。因此我们需要在原先bellman-ford松弛n-1次的基础上,继续松弛一次,这样就能过掉这样的测试数据了。
代码:
#include<cstdio> #include<iostream> #include<string> #include<map> #define Maxn 100 using namespace std; struct line{ int u,v; double rate; }p[Maxn*Maxn]; string s; map<string,int> mp; double maxdist[Maxn]; bool flag; void bellman(int u,int n,int m){ for(int i=0;i<n;i++) maxdist[i]=0; maxdist[u]=1; for(int i=0;i<n;i++) for(int j=0;j<m;j++) if(maxdist[p[j].u]*p[j].rate>maxdist[p[j].v]) maxdist[p[j].v]=maxdist[p[j].u]*p[j].rate; if(maxdist[u]>1) flag=true; } int main() { int n,m,cas=1; double a; while(scanf("%d",&n),n){ mp.clear(); scanf("%d",&n); for(int i=0;i<n;i++){ cin>>s; mp[s]=i; } scanf("%d",&m); for(int i=0;i<m;i++){ cin>>s>>p[i].rate; p[i].u=mp[s]; cin>>s; p[i].v=mp[s]; } flag=false; for(int i=0;i<n&&!flag;i++) bellman(i,n,m); printf("Case %d: %s\n",cas++,flag?"Yes":"No"); } return 0; }