第一次做差分約束,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;
}