poj3259 bellman—ford

来源:互联网 发布:珠海网络教育报名 编辑:程序博客网 时间:2024/05/23 15:48

卡在奇怪的地方一晚上!!!

思路不难,就是最短路,不过虫洞是正权值的双向通路,过虫洞是负权值的单向通道。

松弛完再判断是否有负权环

#include<stdio.h>#define INF 999999999int main(){    int dis[5000],n,m,c,s,k,e,t,u[6000],v[6000],w[6000];//没错,卡在这里,5000WA一晚上!!!!    scanf("%d",&k);    while(k--)    {        scanf("%d %d %d",&n,&m,&c);        int sum=0;        for(int i=1;i<=m;i++)                               //正常        {            scanf("%d %d %d",&s,&e,&t);            u[sum]=v[sum+1]=s;            v[sum]=u[sum+1]=e;            w[sum++]=t;            w[sum++]=t;        }        for(int i=1;i<=c;i++)                               //虫洞        {            scanf("%d %d %d",&s,&e,&t);            u[sum]=s;            v[sum]=e;            w[sum++]=-t;        }        bool flage=1;        for(int i=0;i<4000;i++)            dis[i]=INF;        for(int i=1;i<=n-1;i++)                                     //bellman_ford        {            flage=0;            for(int j=0;j<sum;j++)            {                if(dis[v[j]]>dis[u[j]]+w[j])                    dis[v[j]]=dis[u[j]]+w[j],flage=1;            }            if(flage==0)                break;        }        flage=0;        for(int i=0;i<sum;i++)                           //判负权环        {            if(dis[v[i]]>dis[u[i]]+w[i])                {flage=1;                break;}        }        if(flage)            printf("YES\n");        else            printf("NO\n");    }    return 0;}


0 0
原创粉丝点击