poj1860

来源:互联网 发布:windows update 编辑:程序博客网 时间:2024/05/17 04:47

链接:点击打开链接

题意:钱的种类为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;}


0 0