POJ 1364

第一次做差分約束,WA了無數次吶

做後還是依葫蘆畫瓢,跌跌撞撞給過了

 

http://poj.org/problem?id=1364

asi + asi+1+ ..... + asi+ni < ki 或 >ki

知道 a-b<c  => a-b<=c-1

令sum(i)=A1+A2+...+Ai-1

asi + asi+1 +....+ asi+ni = sum(si+ni+1) - sum(i)  <= ki-1

 

SPFA:

#include<stdio.h>
#include<string.h>
#define M 105
#define INF 0xfffffff

int G[M][M];
int d[M];
int que[M*M];
int time[M];
bool inq[M];
int n,m;

bool spfa()
{
	int i,p;
	int l=0,r=0;
	memset(time,0,sizeof(time));
	memset(inq,false,sizeof(inq));
	for(i=0;i<=n+1;i++)
		d[i]=INF;
	d[0]=0;
	time[0]++;
	que[r++]=0;
	inq[0]=true;
	while(l<r)
	{
		p=que[l++];
		inq[p]=false;
		for(i=0;i<=n+1;i++)
			if(d[i]>d[p]+G[p][i])
			{
				d[i]=d[p]+G[p][i];
				if(!inq[i])
				{
					que[r++]=i;
					inq[i]=true;
					time[i]++;
					if(time[i]>=n+2)//包括0點在內的話有n+2個節點 
						return false;
				}
			}
	}
	return true;
}

int main()
{
	int i,j;
	int si,ni,w;
	char oi[10];
	while(scanf("%d",&n)&&n)
	{
		scanf("%d",&m);
		for(i=0;i<=n+1;i++)
			for(j=0;j<=n+1;j++)
				if(i==0||i==j) G[i][j]=0;
				else G[i][j]=INF;
		while(m--)
		{
			scanf("%d%d",&si,&ni);
			scanf("%s%d",oi,&w);
			if(oi[0]=='g')
				G[si][si+ni+1]=-w-1;
			else if(oi[0]=='l')
				G[si+ni+1][si]=w-1;
		}
		if(spfa())
			printf("lamentable kingdom\n");
		else printf("successful conspiracy\n");
	}
	return 0;
}


bellman_ford:

#include<stdio.h>
#include<string.h>
#define M 120
#define INF 0xfffffff

struct node
{
	int s,e,w;
}edge[M];

int n,m;
int d[M];

bool bellman_ford()
{
	int i,j;
	for(i=0;i<=n+1;i++)
		d[i]=INF;
	d[0]=0;
	for(i=1;i<=n+1;i++)
		for(j=0;j<=n+m;j++)
			if(d[edge[j].e]>d[edge[j].s]+edge[j].w)
				d[edge[j].e]=d[edge[j].s]+edge[j].w;
	for(i=0;i<=n+m;i++)
		if(d[edge[i].e]>d[edge[i].s]+edge[i].w)
			return false;
	return true;
}

int main()
{
	int i,j;
	int si,ni,w;
	char oi[5];
	while(scanf("%d",&n)&&n)
	{
		scanf("%d",&m);
		for(i=0;i<m;i++)
		{
			scanf("%d%d%s%d",&si,&ni,oi,&w);
			if(oi[0]=='g')
			{
				edge[i].s=si;
				edge[i].e=si+ni+1;
				edge[i].w=-w-1;
			}
			else if(oi[0]=='l')
			{
				edge[i].s=si+ni+1;
				edge[i].e=si;
				edge[i].w=w-1;
			}
		}
		for(i=1,j=m;i<=n+1;i++,j++)
		{
			edge[j].s=0;
			edge[j].e=i;
			edge[j].w=0;
		}
		if(bellman_ford())
			puts("lamentable kingdom");
		else puts("successful conspiracy");
	}
	return 0;
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章