POJ 2240 Arbitrage

解题思路: Bellman-Ford算法,求解负权回路问题,考虑到图的不连通性,添加一个超级初始点,到各顶点汇率均为1:

#include <iostream>
#include
<map>
#include
<string>
using namespace std;

int main()
{
int N, M , L = 1;
double rate;
string curStr, curStr1, curStr2;
map
<string, int>name;
double dist[305];

struct
{
int u,v;
double rate;
}edge[
1000];

while (cin >> N && N)
{
fill(
&dist[0], &dist[304], 1000.0);
for (int i = 1; i <= N; i++)
{
cin
>> curStr;
name[curStr]
= i;
}
cin
>> M;
for (int i = 0; i < M; i++)
{
cin
>> curStr1 >> rate >> curStr2;
edge[i].u
= name[curStr1];
edge[i].v
= name[curStr2];
edge[i].rate
= rate;
}
bool isChanged = true;
for (int i = 0; i < N && isChanged; i++)
{
isChanged
= false;
for (int j = 0; j < M; j++)
{
if (dist[edge[j].v] < dist[edge[j].u] * edge[j].rate)
{
dist[edge[j].v]
= dist[edge[j].u] * edge[j].rate;
isChanged
= true;
}
}
}
name.clear();
cout
<<"Case " << L << (isChanged ? (": Yes") : (": No")) << endl;
L
++;
}
return 0;
}

posted on 2010-11-07 11:55  ltang  阅读(200)  评论(0编辑  收藏  举报

导航