每日打卡(1/2)
传送门:点击打开链接
题目大意:
货币换来换去啦,要求能否通过一系列兑换后,还兑换回自己的货币,并且钱增多了。
题目思路:
用Bellman-Ford算法进行n-1次松弛,此时已经得到了最长路。如果还能进行松弛操作,说明存在正环。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn = 105;
struct node{
int x,y;
double rate;
double cost;
};
vector<node>E;
double v,dis[maxn];
int n,m,s;
void init()
{
memset(dis,0,sizeof(dis));
}
bool bellman()
{
dis[s] = v;
bool flag;
for(int i=1;i<=n-1;i++)
{
flag = false;
for(int j=0;j<E.size();j++)
{
if(dis[E[j].y]<(dis[E[j].x]-E[j].cost)*E[j].rate)
{
dis[E[j].y]=(dis[E[j].x]-E[j].cost)*E[j].rate;
flag = true;
}
}
if(!flag) break;
}
for(int i=0;i<E.size();i++)
{
if(dis[E[i].y]<(dis[E[i].x]-E[i].cost)*E[i].rate)
return true;
}
return false;
}
int main()
{
scanf("%d%d%d%lf",&n,&m,&s,&v);
init();
for(int i=0;i<m;i++)
{
node a,b;
cin>>a.x>>a.y>>a.rate>>a.cost>>b.rate>>b.cost;
b.x = a.y;
b.y = a.x;
E.push_back(a);
E.push_back(b);
}
if(bellman()) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
return 0;
}