這個題目沒有規定初始位置,只要有路徑成正環就行。用Floyd算法,計算最長路。如果有一個點到自身的長度大於1,說明存在正環,輸出Yes。
因爲點的名字是字符串,所以用map映射一下。而且輸入數據比較多,直接用cin,cout會超時。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#include<iomanip>
#include<map>
#define ll long long
#define ld long double
#define INF 0x3f3f3f3f
#define mem(a,b) memset(a,b,sizeof a)
using namespace std;
int n,m;
double G[32][32];
map<string,int> f; //建立一個名字和節點的對應
int floyd()
{
for(int k=1; k<=n; k++)
{
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
if(G[i][j]<G[i][k]*G[k][j])
G[i][j]=G[i][k]*G[k][j];
}
if(G[i][i]>1) //發現正環,直接返回1就行
return 1;
}
}
return 0;
}
int main()
{
std::ios::sync_with_stdio(false); //卡輸入輸出
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
int ccase=1;
while(cin>>n)
{
if(n==0)
break;
string a,c;
double b;
for(int i=1; i<=n; i++)
{
cin>>a;
f[a]=i;
}
cin>>m;
mem(G,0);
for(int i=1; i<=m; i++)
{
cin>>a>>b>>c;
G[f[a]][f[c]]=b;
}
cout<<"Case "<<ccase++<<": ";
if(floyd())
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}
Your job is to write a program that takes a list of currency exchange rates as input and then determines whether arbitrage is possible or not.
Input
Test cases are separated from each other by a blank line. Input is terminated by a value of zero (0) for n.
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