poj3259

来源:互联网 发布:对网络语言的看法ppt 编辑:程序博客网 时间:2024/06/06 05:37

一段时间没编程了,手感很生硬,一道bellon-ford的模板题,关键容易出错的是还要反向保存一次,bellon-ford的思想就是先放缩,然后发现还可以放缩说明含有负权回路。

#include <stdio.h>int s[10005],e[10005],v[10005],dis[10005];//第i条道路的起点,终点和权值 int main() {     int i,j,k,n,m,w,flag,T;     scanf("%d",&T);     while(T--)     {         scanf("%d%d%d",&n,&m,&w);         for (i=1;i<=m;i++)         scanf("%d%d%d",&s[i],&e[i],&v[i]);         for (i=m+1;i<=2*m;i++)         {             s[i]=e[i-m];             e[i]=s[i-m];             v[i]=v[i-m];         }//无相图需要反向保存一次         for (i=2*m+1;i<=2*m+w;i++)         {         scanf("%d%d%d",&s[i],&e[i],&v[i]);         v[i]=-v[i];         }         for (i=2;i<=n;i++)         dis[i]=1000000;         dis[1]=0;         for (i=1;i<=n-1;i++)         {             for (j=1;j<=2*m+w;j++)             {                 if (dis[e[j]]>dis[s[j]]+v[j])                    dis[e[j]]=dis[s[j]]+v[j];             }         }             flag=0;             for (j=1;j<=2*m+w;j++)             {                 if (dis[e[j]]>dis[s[j]]+v[j])                    flag=1;             }             if (flag==1)//含有负权回路             printf("YES\n");            else                printf("NO\n");         }     return 0; }


0 0