ZOJ1655

来源:互联网 发布:阿里云ftp默认端口号 编辑:程序博客网 时间:2024/06/07 07:56

题意:1号点为首都,其他点上都有物资,每经过一条边都会有一个损耗比,问最多多少物资能运到首都

题解: 最短路,求消耗比例最少的从首都到其他城市的路,然后sigma w[k]*rate[1][k] k>1 k<=n即可

#include<bits/stdc++.h>#define w second#define y firstusing namespace std;const int MAXN=200;int n,m;typedef pair<int ,double>pii;double d[MAXN],f[MAXN];vector<pii>a[MAXN];void spfa(){    bool vis[MAXN]={0};    queue<int>q;    memset(d,0,sizeof(d));    d[n]=1.0;    vis[n]=true;    q.push(n);    while (!q.empty())    {        int h=q.front();        q.pop();        for (int i=0;i<a[h].size();i++)        {            if (d[h]*a[h][i].w>d[a[h][i].y])            {                d[a[h][i].y]=d[h]*a[h][i].w;                if (!vis[a[h][i].y])                {                    q.push(a[h][i].y);                    vis[a[h][i].y]=true;                }            }        }        vis[h]=false;    }}void Gao(){    for (int i=1;i<=n;i++)        a[i].clear();    for (int i=1;i<n;i++)        scanf("%lf",f+i);    for (int i=0;i<m;i++)    {        int xx,yy;        double zz;        scanf("%d%d%lf",&xx,&yy,&zz);        double rate=1.0-zz;        a[xx].push_back(make_pair(yy,rate));        a[yy].push_back(make_pair(xx,rate));    }    spfa();    double ans=0.0;    for (int i=1;i<n;i++)        ans+=f[i]*d[i];    printf("%.2lf\n",ans);}int main(){    //freopen("a.in","r",stdin);    while (cin>>n>>m)        Gao();    return 0;}


0 0
原创粉丝点击