poj 3259
来源:互联网 发布:怎么让眼白变清澈知乎 编辑:程序博客网 时间:2024/05/18 02:10
终于可以睡了,一道模板题没想到也能犯那么多的错的。。不过收获不少~
/*poj_3259 最短路模板题,第一次写bellman-ford,犯了N多错。。注意:1.path是双向的,虫洞是单向的。 2.因为我用了INT_MAX, 此句 if( dist[a]!=INT_MAX && dist[b]>dist[a]+edge[j].value ) 必须加 dist[a]!=INT_MAX ,否则会溢出。。 3.要找的是一条负权回路,而我一开始理解成松弛所有边n-1次后dist[1]为负即可。。 4.我一开始将dist数组初始化为0,这样显然不行,因为后面正负权边的叠加也可能出现0的情况。*/#include <iostream>#include <cstdio>#include <string.h>#include <limits.h>using namespace std;int dist[510];struct edgeinf{ int sta,end,value; void set( int i,int j,int k ) { sta=i,end=j,value=k; }}edge[5500];bool bellman( int n,int m ){ int i,j,a,b; bool in; for( i=2;i<=n;i++ ) dist[i]=INT_MAX; dist[1]=0; for( i=1;i<=n;i++ ) { in=false; for( j=0;j<m;j++ ) { a=edge[j].sta , b=edge[j].end; if( dist[a]!=INT_MAX && dist[b]>dist[a]+edge[j].value ) dist[b]=dist[a]+edge[j].value , in=true; } if( !in ) break; } if( i==n+1 ) return true; else return false;}int main(){ int T,n,m,w,i,j; int a,b,value; scanf( "%d",&T ); while( T-- ) { scanf( "%d%d%d",&n,&m,&w ); j=0; for( i=0;i<m;i++ ) { scanf( "%d%d%d",&a,&b,&value ); edge[j++].set( a,b,value ); edge[j++].set( b,a,value ); } for( i=0;i<w;i++ ) { scanf( "%d%d%d",&a,&b,&value ); edge[j++].set( a,b,-value ); } if( bellman( n,j ) ) printf( "YES\n" ); else printf( "NO\n" ); } return 0;}
//用邻接矩阵的一种实现,效率很低。。#include <iostream>#include <cstdio>#include <string.h>#include <limits.h>using namespace std;int map[510][510];int dist[510];void bellman( int n ){ int i,j,k; bool in; memset( dist,0,sizeof(dist) ); for( i=1;i<=n;i++ ) { in=false; for( j=1;j<=n;j++ ) for( k=1;k<=n;k++ ) { if( map[j][k]!=0 ) { if( dist[j]!=INT_MAX && dist[k]>dist[j]+map[j][k] ) dist[k]=dist[j]+map[j][k] , in=true ; } } if( !in ) break; } if( i==n+1 ) printf( "YES\n" ); else printf( "NO\n" );}int main(){ int T,n,m,w,i,j; int a,b,value; scanf( "%d",&T ); while( T-- ) { memset( map,0,sizeof(map) ); scanf( "%d%d%d",&n,&m,&w ); for( i=0;i<m;i++ ) { scanf( "%d%d%d",&a,&b,&value ); if( map[a][b]==0 || map[a][b]>value ) { map[a][b]=value; map[b][a]=map[a][b]; } } for( i=0;i<w;i++ ) { scanf( "%d%d%d",&a,&b,&value ); if( map[a][b]==0 || map[a][b]>-value ) map[a][b]=-value; } bellman(n); } return 0;}
- poj 3259
- poj 3259
- poj-3259
- poj 3259
- poj 3259
- poj 3259
- POJ 3259
- poj 3259
- poj.3259
- poj-3259
- POJ 3259
- poj-3259
- poj 3259
- POJ-3259
- poj 3259
- POJ 3259
- poj----3259
- poj 3259
- oracle物化视图
- 实验
- 现阶段学习的方向
- c/c++结构体几种定义情况总汇二
- CakePHP: 复杂关联查询时出现Unknown Column错误
- poj 3259
- Java【多线程知识总结(10)】线程通信之wait()与notify()的运用--模拟指挥官指挥2个连队交替轰炸战区
- 程序员应知——破窗与童子军军规
- nohup命令
- oracle03_gc安装
- Android JNI 使用的数据结构JNINativeMethod详解
- 冒泡排序
- 搞不懂
- oracle04_struc