Bellman-Ford算法之三

//poj 2240 Arbitrage

#include
<iostream> //Bellman-Ford算法的变形
#include<string>

using namespace std;
const int maxnum = 32;

typedef
struct Edge
{
int u, v;
double rate;
}Edge;

Edge edge[
100000];
double dist[maxnum];

int nodenum, edgenum;
string table[32];

void input()
{
string str,str1,str2;
int i,j;
for(i=0;i<nodenum;++i)
{
cin
>>str;
table[i]
=str;
}
cin
>> edgenum;
for(int i=1; i<=edgenum; ++i)
{
cin
>>str1>>edge[i].rate>>str2;
for(j=0;j<nodenum;++j)
if(table[j]==str1)
break;
edge[i].u
=j+1;
for(j=0;j<nodenum;++j)
if(table[j]==str2)
break;
edge[i].v
=j+1;
}
}
bool relax(int u, int v, double r)
{
if(dist[v] < dist[u] * r ) //这里是小于号
{
dist[v]
= dist[u] * r ;
return 1;
}
return 0;
}
bool Bellman_Ford()
{
for(int i=1; i<=nodenum-1; ++i)
{
int tag=1;
for(int j=1; j<=edgenum; ++j)
if(relax(edge[j].u, edge[j].v, edge[j].rate))
tag
=0;
if(tag==1)
break;
}
// 判断是否有正权回路
for(int i=1; i<=edgenum; ++i)
if(dist[edge[i].v] < dist[edge[i].u] * edge[i].rate) //这里是小于号
return 1;
return 0;
}
int main()
{
int t=1;
while(cin>>nodenum&&nodenum)
{
int tag=0;
input();
for(int i=1; i<=nodenum; ++i)
dist[i]
= 1.00; //注意初始化值
if(Bellman_Ford())
printf(
"Case %d: Yes\n",t++);
else
printf(
"Case %d: No\n",t++);
}
return 0;
}

  

//poj 2240 Arbitrage
Floyd 算法的变形
//poj 2240 Arbitrage
#include <iostream> //Floyd 算法的变形
#include<string>
#include
<map>
using namespace std;
const int maxnum = 32;
double distF[maxnum][maxnum],curr;
int nodenum,edgenum,t=1;
map
<string,int> col;
void init()
{
for(int i=1;i<=nodenum;++i)
for(int j=1;j<=nodenum;++j)
if(i==j)
distF[i][j]
=1.0;
else
distF[i][j]
=0;
}
void Floyd()
{
for(int k=1;k<=nodenum;++k)
for(int i=1;i<=nodenum;++i)
for(int j=1;j<=nodenum;++j)
distF[i][j]
=max(distF[i][j],distF[i][k]*distF[k][j]); //松弛计算
}
int main()
{
int i;
string str,str1,str2;
while(cin>>nodenum&&nodenum)
{
for(i=1;i<=nodenum;++i)
{
cin
>>str;
col.insert(make_pair(str,i));
}
init();
cin
>>edgenum;
for(i=0;i<edgenum;++i)
{
cin
>>str1>>curr>>str2;
distF[col[str1]][col[str2]]
=curr;
}
Floyd();
int tag=0;
for(i=1;i<=nodenum&&!tag;++i)
if(distF[i][i]>1.0) //说明存在使货币i升值的回路
tag=1;
if(tag)
printf(
"Case %d: Yes\n",t++);
else
printf(
"Case %d: No\n",t++);
}
return 0;
}

  

posted on 2011-07-17 01:23  sysu_mjc  阅读(155)  评论(0编辑  收藏  举报

导航