与poj2240很像。大概题意是Nick有某种货币S,数量为V,总共有N种货币兑换(包括S),有M个交易点,每个交易点只兑换某两种货币,可能有几个交易点交易相同的货币,即两点之间可能存在几条权值不同的边。问是否有可能通过多次兑换使Nick手中的S货币增值。
对图中的所有边进行松弛,如果在一次松弛所有边的操作中,对任意一点都没有增值作用,而此时d[S](S的数量)仍然小于等于V,则说明没有可能通过兑换使S增值。
#include<iostream> #include<stdio.h> #include<string.h> #define MAXD 110 using namespace std; int N,M,S,count; double V,d[MAXD]; struct Edge { int u; int v; double r; double c; }edge[MAXD]; int bellman() { int i; double t; bool flag; while(d[S]<=V) { flag=false; for(i=0;i<count;i++) { t=(d[edge[i].u]-edge[i].c)*edge[i].r; if(d[edge[i].v]<t) { d[edge[i].v]=t; flag=true; } } if(!flag) return 0; } return 1; } int main() { //freopen("test.txt","r",stdin); scanf("%d%d%d%lf",&N,&M,&S,&V); int i,j,a,b,t; double r_1,c_1,r_2,c_2; count=0; for(i=1;i<=M;i++) { scanf("%d%d%lf%lf%lf%lf",&a,&b,&r_1,&c_1,&r_2,&c_2); edge[count].u=a; edge[count].v=b; edge[count].r=r_1; edge[count].c=c_1; count++; edge[count].u=b; edge[count].v=a; edge[count].r=r_2; edge[count].c=c_2; count++; } for(i=1;i<=N;i++) d[i]=0; d[S]=V; if(bellman()) printf("YES\n"); else printf("NO\n"); return 0; }