poj1364(King)

         题目链接:http://poj.org/problem?id=1364

         题意:给出n个变量,m个约束公式 asi + asi+1 + .... + asi+ni < ki or > ki ,叫你判断是否存在着解满足这m组约束公式。

          分析:asi + asi+1 + ....... + asi + n < ki or > ki,因为ai和ki都为整,设sum[n] 为 变量ai的前n个和,则可以转化为 sum[si+n] - sum[si-1] <= ki -1 or sum[si-1] - sum[si+n] <= -1-ki ,这样问题就转化为差分约束的情况,可以差用Bellman-Ford算法进行求解。

 代码:

#include<stdio.h>
#include<string.h>
struct Edge
{
	int u;
	int v;
	int w;
}edge[105];
int dis[105];
int n,m,p;
int si,ni,ki;
char oi[3];
int Bellman_ford()
{
	int i,j;
    memset(dis,0,sizeof(dis));
	for(i=1;i<=n;i++)//引入源点0之后有n+1个点了,最多松弛n次
		for(j=0;j<p;j++)
           if(dis[edge[j].v]>dis[edge[j].u]+edge[j].w)
			dis[edge[j].v] = dis[edge[j].u]+edge[j].w;
   for(i=0;i<p;i++)//如果第n+1还可以松弛,则说明存在负权环,即不存在这样的序列
	   if(dis[edge[i].v]>dis[edge[i].u]+edge[i].w)
		   return 1;
	   return 0;
}
int main()
{
	int i;
	while(scanf("%d",&n) && n!=0)
	{
		p=0;
		scanf("%d",&m);
        for(i=0;i<m;i++)
		{
			scanf("%d%d%s%d",&si,&ni,oi,&ki);
			if(oi[0]-'l' == 0)
			{
				edge[p].u=si-1;
				edge[p].v=si+ni;
				edge[p].w=ki-1;
				p++;
			}
			else 
			{
                edge[p].u=si+ni;
				edge[p].v=si-1;
				edge[p].w=-ki-1;
				p++;
			}
		}
		if(Bellman_ford())
			printf("successful conspiracy\n");
		else 
			printf("lamentable kingdom\n");
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值