zoj2770,差分约束系统

来源:互联网 发布:菜谱软件哪个最好 编辑:程序博客网 时间:2024/04/29 22:26

差分约束系统,spfa判负环。

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#define INF 2000000000int dis[1005],cnt[1005],first[1005],next[20005],idx,aa[1005],s[1005],queue[100005];struct edge{    int u;    int v;    int w;}en[20005];void add(int a,int b,int c){    idx++;    en[idx].u=a;    en[idx].v=b;    en[idx].w=c;    next[idx]=first[a];    first[a]=idx;}int spfa(int n){    int i,j,k,l,begin,end,x;    begin=0;end=1;    queue[0]=0;    while(begin!=end)    {        x=queue[begin];        begin++;//        printf("*%d %d\n",x,dis[x]);        cnt[x]++;        if(cnt[x]>n+1)            return -1;        for(i=first[x];i!=-1;i=next[i])        {            if(dis[en[i].v]<dis[x]+en[i].w)            {                dis[en[i].v]=dis[x]+en[i].w;                queue[end]=en[i].v;                end++;            }        }    }    return dis[n];}int main(){    int n,m,i,j,k,l,a,b,c,re;    while(scanf("%d%d",&n,&m)!=EOF)    {        memset(first,-1,sizeof(first));        memset(next,-1,sizeof(next));        idx=0;        s[0]=0;        for(i=1;i<=n;i++)        {            scanf("%d",&aa[i]);            s[i]=s[i-1]+aa[i];            add(i,i-1,-aa[i]);            add(i-1,i,0);            add(0,i,0);        }        memset(cnt,0,sizeof(cnt));        for(i=1;i<=m;i++)        {            scanf("%d%d%d",&a,&b,&c);            add(a-1,b,c);            //add(b,a-1,s[a-1]-s[b]);//这句没想明白为什么加上后是错的        }        for(i=0;i<=n;i++)            dis[i]=-INF;        dis[0]=0;        re=spfa(n);        if(re<0)            printf("Bad Estimations\n");        else            printf("%d\n",re);//        for(i=1;i<=idx;i++)//            printf("#%d %d %d %d\n",i,en[i].u,en[i].v,en[i].w);    }    return 0;}


0 0
原创粉丝点击