UVa 515 King / 差分约束

问你是否存在一个序列 然后满足一段子序列和要等于或者小于k

第一次碰到这个 叫差分约束 听过 现在见识了

转换成最短路 建图 存在负环就说明不存在解

判断负环 Bellman-Ford 或者SPFA

代码好写 关键思路

#include <stdio.h>
struct node
{
	int s;
	int e;
	int w;
}a[2010];
int n,m;
int dis[1010];

bool BF()
{
	int i,j,k;
	int x,y,z;
	for(i = 0;i <= n + 1; i++)
		dis[i] = 999999999;
	dis[0] = 0;
	for(i = 0;i <= n; i++)
	{
		for(j = 0;j < m; j++)
		{
			x = a[j].s;
			y = a[j].e;
			z = a[j].w;
			if(dis[y] > dis[x] + z)
				dis[y] = dis[x] + z;
		}
	}
	for(j = 0;j < m; j++)// 如果松弛了n-1次还能松弛 说明有负环 
	{
		x = a[j].s;
		y = a[j].e;
		z = a[j].w;
		if(dis[y] > dis[x] + z)
		{
			return false;
		}
	}
	return true; 
}
int main()
{
	int t,i,x,y,z;
	char str[10];
	while(scanf("%d",&n),n)
	{
		scanf("%d",&m);
		for(i = 0;i < m; i++)
		{
			scanf("%d %d %s %d",&x,&y,str,&z);
			if(str[0] == 'g')
			{
				a[i].s = x + y + 1;
				a[i].e = x;
				a[i].w = - z - 1;
			}
			else
			{
				a[i].s = x;
				a[i].e = x + y + 1;
				a[i].w = z - 1;
			}
		}
		if(BF())
		{
			puts("lamentable kingdom");
		}
		else
		{
			puts("successful conspiracy");
		}
	}
	return 0;
}


 

你可能感兴趣的:(UVa 515 King / 差分约束)