版权声明:希望能帮到弱校的ACMer成长,因为自己是弱校菜鸡~~~~ https://blog.csdn.net/Mr__Charles/article/details/82054650
POJ T2240 Arbitrage
题目思路:
本题跟POJ 1806思路一样,判断正环,只是要给货币种类编号。用STL的话可以用map 映射,鄙人用的是普通遍历匹配— . —
代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#define maxn 35
using namespace std;
double dis[maxn];
int n,m;
string name[maxn];
struct Edge{
int u,v;
double r;
}edge[maxn*maxn];
int find(string s){
for(int i = 1; i <= n; i++){
if(s == name[i]) return i; //给货币编号
}
}
void Init(){
for(int i = 1; i <= n; i++){
dis[i] = 0; //初始化为0
}
}
bool Bellman_ford(int start){
dis[start] = 1;
bool flag;
for(int i = 1; i < n; i++){
flag = true;
for(int j = 1; j <= m; j++){
if(dis[edge[j].v] < dis[edge[j].u] * edge[j].r){
dis[edge[j].v] = dis[edge[j].u] * edge[j].r;
flag = false;
}
}
if(flag) break;
}
for(int j = 1; j <= m; j++)
if(dis[edge[j].v] < dis[edge[j].u] * edge[j].r)
return true;
return false;
}
int main(){
string s1,s2;
int kcase = 0;
while(scanf("%d",&n)&&n){
Init();
for(int i = 1; i <= n ;i++)
cin >> name[i];
scanf("%d",&m);
for(int i = 1; i <= m; i++){
cin >> s1;
scanf("%lf",&edge[i].r);
cin >> s2;
edge[i].u = find(s1);
edge[i].v = find(s2);
}
printf("Case %d: ",++kcase);
if(Bellman_ford(1)) printf("Yes\n");
else printf("No\n");
}
return 0;
}