http://acm.hdu.edu.cn/showproblem.php?pid=1217
分析:因为图中存在负权边,所以不能用dis(貌似数据只考虑了第一种钱币的值是否会增加)
Bellman_Ford:
#include <iostream>
#include <cstdio>
#include <map>
#include <cstring>
#include <string>
using namespace std;
const int NM=1005;
double dis[50]; //注意精度
int n,m;
struct{
int x,y;
double rate;
}q[NM];
bool Bellman_Ford(int v)
{
int i,j;
memset(dis,0,sizeof(dis));
dis[v]=1;
for(i=0;i<n;i++){
for(j=0;j<m;j++){
if(dis[q[j].y]<dis[q[j].x]*q[j].rate)
dis[q[j].y]=dis[q[j].x]*q[j].rate;
}
}
for(j=0;j<m;j++){
if(dis[q[j].y]<dis[q[j].x]*q[j].rate)
return true;
}
return false;
}
int main()
{
string str,str2;
double r;
int i,k=1;
while(cin>>n && n)
{
map<string,int>m1;
for(i=0;i<n;i++){
cin>>str;
m1[str]=i;
}
cin>>m;
for(i=0;i<m;i++){
cin>>str>>r>>str2;
q[i].x=m1[str];q[i].y=m1[str2];q[i].rate=r;
}
cout<<"Case "<<k++<<": ";
if(Bellman_Ford(0)) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}
Floyd:
#include<iostream>
#include<cstdio>
#include<map>
#include<string>
#include<cstring>
using namespace std;
const int NM=32;
int main()
{
int i,j,k,x,y,n,m,t;
string str1,str2;
double a[NM][NM],per;
t=1;
while(cin>>n&&n)
{
map<string,int>m1;
memset(a,0,sizeof(a));
for(i=1;i<=n;i++)
{
cin>>str1;
m1[str1]=i;
}
cin>>m;
for(i=0;i<m;i++)
{
cin>>str1>>per>>str2;
x=m1[str1],y=m1[str2];
a[x][y]=per;
}
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(a[i][j]<a[i][k]*a[k][j]) //
a[i][j]=a[i][k]*a[k][j];
}
for(i=1;i<=n;i++)
{
if(a[i][i]>1)
break;
}
if(i<=n)
cout<<"Case "<<t++<<": Yes"<<endl;
else
cout<<"Case "<<t++<<": No"<<endl;
}
return 0;
}