poj 3259 bellman-ford

来源:互联网 发布:netty 监听多个端口 编辑:程序博客网 时间:2024/05/29 11:27

果然还是水啊。。险过。。差点就TLE了。。

题意:

   n个点,正常的路是双向的,wormholes是单向的而且是负权值边。求图中有没有负权值回路。

#include<stdio.h>#define MX 10000000struct point {int in,out,w;}eg[5200];int s[1050],dist[1050],n,m,w,u,v,t;int bellman(int v0){for(int i=1;i<=n;i++)dist[i]=MX;dist[v0]=0;for(int i=0;i<n-1;i++)for(int j=0;j<2*m+w;j++)if(dist[eg[j].in]<MX&&dist[eg[j].in]+eg[j].w<dist[eg[j].out])dist[eg[j].out]=dist[eg[j].in]+eg[j].w;for(int i=0;i<2*m+w;i++)if(dist[eg[i].in]+eg[i].w<dist[eg[i].out])return -1;return 1;}int main(){int f;scanf("%d",&f);while(f--){int k=0,kk=0,flag=0;scanf("%d%d%d",&n,&m,&w);for(int i=0;i<m;i++){scanf("%d%d%d",&u,&v,&t);eg[k].in=u;eg[k].out=v;eg[k].w=t;k++;eg[k].in=v;eg[k].out=u;eg[k].w=t;k++;}for(int i=0;i<w;i++){scanf("%d%d%d",&u,&v,&t);eg[k].in=u;eg[k].out=v;eg[k].w=t*(-1);s[kk++]=u;k++;}for(int i=0;i<kk;i++){if(bellman(s[i])==-1){printf("YES\n");flag=1;break;}}if(!flag)printf("NO\n");}return 0;}


靠 坑啊看了别人的代码。。都是从1开始就行啊,那我为啥还循环呀。。。我个蠢啊。。改了改,90+过了。。上边那个1700+过的。。。疯了。。

#include<stdio.h>#define MX 10000000struct point {int in,out,w;}eg[5200];int s[1050],dist[1050],n,m,w,u,v,t;int bellman(int v0){for(int i=1;i<=n;i++)dist[i]=MX;dist[v0]=0;for(int i=0;i<n-1;i++)for(int j=0;j<2*m+w;j++)if(dist[eg[j].in]<MX&&dist[eg[j].in]+eg[j].w<dist[eg[j].out])dist[eg[j].out]=dist[eg[j].in]+eg[j].w;for(int i=0;i<2*m+w;i++)if(dist[eg[i].in]+eg[i].w<dist[eg[i].out])return -1;return 1;}int main(){int f;scanf("%d",&f);while(f--){int k=0,kk=0,flag=0;scanf("%d%d%d",&n,&m,&w);for(int i=0;i<m;i++){scanf("%d%d%d",&u,&v,&t);eg[k].in=u;eg[k].out=v;eg[k].w=t;k++;eg[k].in=v;eg[k].out=u;eg[k].w=t;k++;}for(int i=0;i<w;i++){scanf("%d%d%d",&u,&v,&t);eg[k].in=u;eg[k].out=v;eg[k].w=t*(-1);s[kk++]=u;k++;}if(bellman(1)==-1)printf("YES\n");                else printf("NO\n");}return 0;

想了想,也对,只是判断负权值回路就行了,所以何必把所有点都遍历一遍呢。。。所以v0不重要,只要是有负权值回路就行了。

原创粉丝点击