poj1860 Currency Exchange(Bellman_ford算法)

思路:Bellman_ford算法判正环。
以前这个算法判负环挺常见的,现在我们可以用来判正环。
也就是改一下松弛操作的方式,仅此就行。
code:

#include<cstdio>
#include<iostream>
using namespace std;
const int maxn = 110;
double dis[maxn];
int n,m,s,len;
double v;
struct node{
    
    
	int u,v;
	double r,c;
}edge[maxn*2];
void bell_ford(int s)
{
    
    
	dis[s] = v;
	for(int i=1;i<=n-1;i++)
	{
    
    
		int flag = 0;
		for(int j=1;j<=len;j++)
		{
    
    
			int u = edge[j].u,v = edge[j].v;
			if(dis[v]<(dis[u]-edge[j].c)*edge[j].r)
			{
    
    
				dis[v] = (dis[u]-edge[j].c)*edge[j].r;
				flag = 1;
			}
		}
		if(flag==0)
		{
    
    
			printf("NO\n");
			return ;
		}
	}
	for(int i=1;i<=len;i++)
	{
    
    
		int u = edge[i].u,v = edge[i].v;
		if(dis[v]<(dis[u]-edge[i].c)*edge[i].r)
		{
    
    
			printf("YES\n");
			return;
		}
	}
	printf("NO\n");
}
int main()
{
    
    
	cin>>n>>m>>s>>v;
	for(int i=1;i<=m;i++)
	{
    
    
		int a,b;
		double a1,b1,a2,b2;
		scanf("%d%d%lf%lf%lf%lf",&a,&b,&a1,&b1,&a2,&b2);
		edge[++len].u = a;edge[len].v = b;edge[len].r = a1,edge[len].c=b1;
		edge[++len].u = b;edge[len].v = a;edge[len].r = a2,edge[len].c=b2; 
	}
	bell_ford(s);
}

猜你喜欢

转载自blog.csdn.net/naiue/article/details/107541884