poj 1860 Beffman-Ford
本题用beffman-ford的思想,来求正环回路,一般是用来求负环回路的,但这里只要把比较大小符号转换一下就行了,反正两个都说明图不是收敛的。因为这是第一次做 beffman-ford的题。主要参考了http://blog.sina.com.cn/s/blog_6635898a0100kxu2.html。谢谢他。
加油吧,孩子,不断进步!!
#include <iostream> #include <fstream> using namespace std; #define MAX 201 int n,m,nums; //n货币种类,m汇率站点数,s Nick手中的货币种类 double money; //Nick手中货币的数量 double dist[MAX]; struct Node { int start,end; double rate,com; }edge[MAX]; bool Bellman_ford() { int i,j,st,ed; double ra,co; for(i=1; i<=n; i++) //初始化距离 dist[i]=0; dist[nums]=money; for(i=1; i<n ; i++) //n-1条通路 { bool finish=true; //完全松弛的判断 for(j=0; j<m; j++) { st=edge[j].start; ed=edge[j].end; ra=edge[j].rate; co=edge[j].com; if( dist[ed]<(dist[st]-co)*ra ) //求可能的最大值 { dist[ed]=(dist[st]-co)*ra; finish=false; } } if(finish) break; } for(i=0; i<m; i++) { st=edge[i].start; ed=edge[i].end; ra=edge[i].rate; co=edge[i].com; if(dist[ed]<(dist[st]-co)*ra) //不收敛 { dist[ed]=(dist[st]-co)*ra; return true; //有正权回路 } } return false; } int main() { int k=0,e,s; double r1,r2,c1,c2; freopen("acm.txt","r",stdin); scanf("%d%d%d%lf",&n,&m,&nums,&money); while(m--) { scanf("%d%d%lf%lf%lf%lf",&s,&e,&r1,&c1,&r2,&c2); edge[k].start=s; //s->e edge[k].end=e; edge[k].rate=r1; edge[k++].com=c1; edge[k].start=e; //e->s edge[k].end=s; edge[k].rate=r2; edge[k++].com=c2; } m=k; if(!Bellman_ford()) printf("NO\n"); else printf("YES\n"); return 0; }
我是一名在校大学生,热爱编程,虽然起步晚了些,但我会努力的。呵呵!
数据结构 算法

浙公网安备 33010602011771号