链接:点击打开链接
题意:钱的种类为N,M条命令,拥有种类为S这类钱的数目为V,命令为将a换成b,剩下的四个数为a对b的汇率和a换成b的税,b对a的汇率和b换成a的税,公式为(钱数-税)*汇率
代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <queue>
#include <algorithm>
using namespace std;
int n,m,s,vis[105];
double w,dis[105],rate[105][105],cate[105][105];
int spfa(int s){
int i,j,u;
queue<int>q;
q.push(s);
dis[s]=w;vis[s]=1;
while(q.size()){
u=q.front();q.pop();
vis[u]=0;
for(i=1;i<=n;i++)
if(dis[i]<(dis[u]-cate[u][i])*rate[u][i]){
dis[i]=(dis[u]-cate[u][i])*rate[u][i];
if(dis[s]>w) //已经能够产生利润就不用再更新了
return 1;
if(!vis[i]){
q.push(i);
vis[i]=1;
}
}
}
return 0;
} //spfs模板
int main(){
int i,j,a,b,temp;
double rab,cab,rba,cba;
while(cin>>n>>m>>s>>w){
memset(vis,0,sizeof(vis));
memset(dis,0,sizeof(dis));
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){
cate[i][j]=0;
if(i==j)
rate[i][j]=1; //i,j相等时rate是1
else
rate[i][j]=0;
}
for(i=1;i<=m;i++){
cin>>a>>b;
cin>>rab>>cab>>rba>>cba;
rate[a][b]=rab;
cate[a][b]=cab;
rate[b][a]=rba;
cate[b][a]=cba;
}
temp=spfa(s);
if(temp)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/stay_accept/article/details/47807597