题目链接 POj 1860 :
http://poj.org/problem?id=1860
货币交换,最短路的巧妙应用 。
#include<stdio.h>
#include<algorithm>
#include<vector>
#include<queue>
#include<string.h>
using namespace std;
const int maxn=100+5;
const int INF=0x3f3f3f3f;
int n,m,sign;
double money;
struct Edge{
int v;
double cost,rate;
Edge(int _v=0,double _cost=0,double _rate=0) :v(_v),cost(_cost),rate(_rate){ }
};
vector<Edge> E[maxn];
bool vis[maxn];
double dist[maxn];
int cnt[maxn];
bool SPFA(int start,int money){
memset(cnt,0,sizeof(cnt));
cnt[start]=1;
memset(vis,false,sizeof(vis));
for(int i=0;i<=n;i++) dist[i]=0;
dist[start]=money;
queue<int >que;
while(!que.empty()) que.pop();
que.push(start);
while(!que.empty()){
int u=que.front();
que.pop();
vis[u]=false;
for(int i=0;i<E[u].size();i++){
int v=E[u][i].v;
if(dist[v]<(dist[u]-E[u][i].cost)*E[u][i].rate ){
dist[v]=(dist[u]-E[u][i].cost)*E[u][i].rate;
if(!vis[v]){
que.push(v);
vis[v]=true;
if(++cnt[v]>n) return true;
}
}
}
}
if(dist[start]>money){
return true;
}
return false;
}
int main(){
//freopen("F:\\123.txt","r",stdin);
while(scanf("%d%d%d%lf",&n,&m,&sign,&money)!=EOF){
int A,B;
double cab,rab,cba,rba;
for(int i=0;i<=n;i++) E[i].clear();
for(int i=0;i<m;i++){
scanf("%d%d%lf%lf%lf%lf",&A,&B,&rab,&cab,&rba,&cba);
E[A].push_back(Edge(B,cab,rab));
E[B].push_back(Edge(A,cba,rba));
}
if(SPFA(sign,money)){
printf("YES\n");
}else{
printf("NO\n");
}
}
return 0;
}