标签:ext des include NPU within for eth next 之间
题目链接:https://vjudge.net/contest/66569#problem/I
题目:
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 0Sample Output
Case 1: Yes Case 2: No
题意:给你n种货币,和m种货币转换关系还有之间的单位货币数,问能否经过这些关系使得原先货数增加
思路:题没有给原先货币数,故令原先货币数为1,这题不是计算路权和而是路权积,利用spfa算法即可快速判断,由于数据范围小
可直接用邻接矩阵来存图,用时79s
// // Created by hy on 2019/7/20. // #include <iostream> #include <algorithm> #include <cstdio> #include <string> #include <queue> #include <map> #include<memory.h> using namespace std; const int maxn=105; #define MAX 0x3f3f3f3f int n,m; double road[maxn][maxn]; double d[maxn]; int book[maxn]; int rnt[maxn]; bool spfa(int s) { memset(book,0,sizeof(book)); memset(d,MAX,sizeof(d)); memset(rnt,0,sizeof(rnt)); queue<int>qu; qu.push(s); book[s]=1; d[s]=1; rnt[s]++; while(!qu.empty()) { int now=qu.front(); qu.pop(); book[now]=0; for(int i=1;i<=n;i++) { if(d[i]<d[now]*road[now][i]) { d[i]=d[now]*road[now][i]; if(!book[i]) { qu.push(i); book[i]=1; rnt[i]++; if(rnt[i]>n-1) return true; } } } } return false; } int main() { int res=0; while (~scanf("%d", &n)) { if(n==0) break; string str; map<string, int> mp; for(int i=1;i<=n;i++) { for(int j=1;j<=i;j++) { if(i==j) road[i][j]=0; else road[i][j]=MAX; } } for (int i = 1; i <= n; i++) { cin >> str; mp[str] = i; } string str1, str2; double num; scanf("%d",&m); for (int i = 1; i <= m; i++) { cin >> str1 >> num >> str2; road[mp[str1]][mp[str2]] = num; } res++; if (spfa(1)) printf("Case %d: Yes\n",res); else printf("Case %d: No\n",res); } return 0; }
[kuangbin带你飞]专题四 最短路练习 I - Arbitrage(判断负环)
标签:ext des include NPU within for eth next 之间
原文地址:https://www.cnblogs.com/Vampire6/p/11219628.html