poj 1364 SPFA+差分约束

来源:互联网 发布:软件研发总监招聘 编辑:程序博客网 时间:2024/04/28 09:36

约束条件:

如果是gt    s[a-1]-s[a+b]<=-c-1;

如果是lt     s[a+b]-s[a-1]<=c-1;

此外,新加的原点与其他点的leth为零。n+1为原点。


#include<stdio.h>#include<string.h>#define MX 10000000int n,m,dist[110],vst[110],list[110],f[1000000];char ss[5];bool visit[110];struct point{int v,leth;int next;}eg[1000010];int SPFA(){memset(vst,0,sizeof(vst));memset(visit,0,sizeof(visit));for(int i=0;i<=n;i++)dist[i]=MX;dist[n+1]=0;int head=0,tail=1;f[1]=n+1;vst[n+1]++;visit[n+1]=true;while(head<tail){int now=f[++head];visit[now]=false;for(int i=list[now];i!=-1;i=eg[i].next){if(dist[now]+eg[i].leth<dist[eg[i].v]){dist[eg[i].v]=dist[now]+eg[i].leth;if(!visit[eg[i].v]){f[++tail]=eg[i].v;vst[eg[i].v]++;visit[eg[i].v]=true;}if(vst[eg[i].v]>n)return -1;}}}return 1;}int main(){while(scanf("%d%d",&n,&m)&&n){int pos=0;memset(list,-1,sizeof(list));for(int i=1;i<=n;i++){eg[pos].v=i;eg[pos].leth=0;eg[pos].next=list[n+1];list[n+1]=pos++;}for(int i=0;i<m;i++){int a,b,c;scanf("%d%d%s%d",&a,&b,ss,&c);if(ss[0]=='g'){eg[pos].leth=-c-1;eg[pos].v=a-1;eg[pos].next=list[a+b];list[a+b]=pos++;}else{eg[pos].leth=c-1;eg[pos].v=a+b;eg[pos].next=list[a-1];list[a-1]=pos++;}}if(SPFA()==1)printf("lamentable kingdom\n");elseprintf("successful conspiracy\n");}return 0;}



原创粉丝点击