题目链接:http://poj.org/problem?id=1860 题目大意:给你一种货币,及其最初的价值,然后给你几种货币间的兑换关系,问能否通过兑换最终使这种货币增值 思路:用spfa算法判断是否能增值 #include<stdio.h> #include<string.h> #include<queue> using namespace std; #define N 105 #define eps 1e-6 int IsIn[N],Count[N]; double R[N][N],C[N][N],val[N],V; int n,m,s; int spfa() { memset(val,0,sizeof(val)); while(val[s]<V+eps) { queue<int>Q; int u,v,flag=0; memset(IsIn,0,sizeof(IsIn)); memset(Count,0,sizeof(Count)); val[s]=V;IsIn[s]=1; Q.push(s); while(!Q.empty()) { u=Q.front(); Q.pop(); IsIn[u]=0; if(Count[u]>N) return 1; //入队超过N次,则存在环,一定会增值 for(v=1;v<=n;v++) { if((val[u]-C[u][v])*R[u][v]>val[v]+eps) { val[v]=(val[u]-C[u][v])*R[u][v]; flag=1; if(!IsIn[v]) { Q.push(v); Count[v]++; } } } } if(!flag) break; } if(val[s]>V+eps) return 1; else return 0; } int main() { int a,b,i; double r1,c1,r2,c2; scanf("%d%d%d%lf",&n,&m,&s,&V); for(i=1;i<=m;i++) { scanf("%d%d%lf%lf%lf%lf",&a,&b,&r1,&c1,&r2,&c2); R[a][b]=r1;R[b][a]=r2; C[a][b]=c1;C[b][a]=c2; } if(spfa()) printf("YES/n"); else printf("NO/n"); return 0; }