基础最短路五 POJ1860

来源:互联网 发布:nginx 伪静态 编辑:程序博客网 时间:2024/05/19 06:36


POJ 1860:http://poj.org/problem?id=1860

n,m皆为100

题目大意: n种钱币,m个钱币交换点。每个交换点支持交换两种货币。 交换之前收取手续费,然后乘以倍数rate交换钱币给你。

                    给你初始的币种以及钱数,问你能不能通过交换点把钱越变越多?


                   这一下子就是Spfa嘛,壮我Spfa算法。 出现了无限增大环就输出Yes就好了。

开心的使用Spfa:

#include"cstdio"#include"iostream"#include"cstring"#include"algorithm"#include"vector"#include"cmath"#include"queue"using namespace std;#define INF 9999999#define inf 109#define loop(x,y,z) for(x=y;x<z;x++)#define ll long longdouble dis[inf];int cnt[inf];int n,m,s;double v;int book[inf];queue<int>q;struct node{    int to;    double fee;    double rate;    node(int i,double j,double k)    {        to=i;        rate=j;        fee=k;    }};vector<node>edge[inf];      //每个货币 对应的换币方法void init(){    int i;    loop(i,1,n+1)edge[i].clear();    loop(i,1,n+1)dis[i]=-1;    memset(book,0,sizeof book);    memset(cnt,0,sizeof cnt);    while(!q.empty())q.pop();}bool spfa(){    q.push(s);    book[s]=1;    dis[s]=v;    int i;    while(!q.empty())    {        int u=q.front();        q.pop();        book[u]=0;        int len=edge[u].size();        loop(i,0,len)        {            node& e=edge[u][i];            if(dis[e.to]<(dis[u]-e.fee)*e.rate)            {                dis[e.to]=(dis[u]-e.fee)*e.rate;                if(!book[e.to])                {                    q.push(e.to);                    book[e.to]=1;                    if(++cnt[e.to]>n)return false;                }            }        }    }    return true;}int main(){    int i,j,k;    double a,b,c,d;    scanf("%d%d%d%lf",&n,&m,&s,&v);    init();    while(m--)    {        scanf("%d%d%lf%lf%lf%lf",&i,&j,&a,&b,&c,&d);        edge[i].push_back(node(j,a,b));        edge[j].push_back(node(i,c,d));    }    if(spfa())printf("NO\n");    else printf("YES\n");    return 0;}


0 0
原创粉丝点击