題意:給出n種貨幣,m中交換關係,給出兩種貨幣匯率和手續約,求能不能通過貨幣間的兌換使財富增加。用Bellman_Ford 求出是否有正環,如果有的話就可以無限水鬆弛,財富可以無限增加。
#include<string.h> #include<stdio.h> const int N=110; const int inf=0x3fffffff; int start,num,n; double dist[N],wf; struct edge { int st,ed; double cost,w; }e[220]; void addedge(int x,int y,double w,double c) { e[num].st=x;e[num].ed=y;e[num].cost=c;e[num++].w=w; } int Bellman_Ford() { int flag=0,i,u,v,j; for(i=1;i<=n;i++) dist[i]=0; dist[start]=wf; for(i=1;i<n;i++)//n-1次鬆弛 { for(j=0;j<num;j++) { u=e[j].st;v=e[j].ed; if(dist[v]<(dist[u]-e[j].cost)*e[j].w) { dist[v]=(dist[u]-e[j].cost)*e[j].w; flag=1; } } if(flag==0)break; } for(i=0;i<num;i++) if(dist[e[i].ed]<(dist[e[i].st]-e[i].cost)*e[i].w)//有正環 return 1; return 0; } int main() { int m,i,x,y; double a,b,c,d; while(scanf("%d%d%d%lf",&n,&m,&start,&wf)!=-1) { num=0; for(i=1;i<=m;i++) { scanf("%d%d%lf%lf%lf%lf",&x,&y,&a,&b,&c,&d); addedge(x,y,a,b); addedge(y,x,c,d); } if(Bellman_Ford()) printf("YES\n"); else printf("NO\n"); } return 0; }