您的位置:首页 > 其它

poj 1860 -- Currency Exchange(最短路)

2013-01-20 00:05 344 查看
货币交换,货币之间可以交换,有汇率和税,要求进行若干次交换之后会是手中的钱是否增加

反向使用bellman,往大“松弛”,如果增加则返回true

#include<iostream>
#include<queue>
using namespace std;
int cnt;
double V;
double dis[101];
struct curren
{
double rate;
double comm;
};
curren a[101][101];
bool bellman(int v)
{
bool isin[101]= {0};
isin[v]=1;
queue<int> q;
q.push(v);
while(q.size())
{
int t=q.front();
for(int i=1; i<=cnt; i++)
{
double tmp=(dis[t]-a[t][i].comm)*a[t][i].rate;
if(tmp>dis[i])
{
dis[i]=tmp;
if(isin[i]==0)
{
isin[i]=1;
q.push(i);
}
}
}
q.pop();
isin[t]=0;
if(dis[v]>V)
return true;
}
return false;
}
int main()
{
for(int i=0; i<101; i++)
for(int j=0; j<101; j++)
a[i][j].rate=a[i][j].comm=0.0;
for(int i=0; i<101; dis[i++]=0);
int m,s;
cin>>cnt>>m>>s>>V;
dis[s]=V;
while(m--)
{
int t1,t2;
cin>>t1>>t2;
cin>>a[t1][t2].rate>>a[t1][t2].comm>>a[t2][t1].rate>>a[t2][t1].comm;
}
if(bellman(s))
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: