HDOJ  4318    Power transmission

来源:互联网 发布:js 按字母排序 编辑:程序博客网 时间:2024/06/14 00:08

题目:http://acm.hdu.edu.cn/showproblem.php?pid=4318

结题报告:

我们要求损耗最小,也就是剩余最大。对于每个节点,我们记录起当前可以达到的剩余最大电力。和Dijkstra算法相似,我们这里每次找寻的是尚未标记的拥有最大值的结点,并把这个最大值作为当前结点的最终结果,标记此结点并通过当前结点拓展与之相连的结点。因为从一个结点传输电力到另一个几点,电力的总量是不会增加的。所以,在以后的贪心过程中,不会更新之前已经标记的结点,因为不可能有更大的值。

 

这里我用的这种方法是搜索,感觉其实也差不多

 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#define inf 1000000
using namespace std;
struct node
{
    intnumber;
    inta[50][2];
}a_node[50010];
double b[51000];
queue<int> q;
int s,t,n;
double m;
int main()
{
   while(scanf("%d",&n)!=EOF)
    {
       memset(a_node,-1,sizeof(a_node));
       for(int i=0;i<51000;i++)
           b[i]=-1;
       for(int i=1;i<=n;i++)
       {
               scanf("%d",&a_node[i].number);
               for(int j=0;j<a_node[i].number;j++)
               {
                   scanf("%d",&a_node[i].a[j][0]);
                   scanf("%d",&a_node[i].a[j][1]);
               }
       }
       scanf("%d%d%lf",&s,&t,&m);
       b[s]=0;
       q.push(s);
       int hd;
       while(!q.empty())
       {
           hd=q.front();
           q.pop();
           for(int i=0;i<a_node[hd].number;i++)
           {
               if(b[a_node[hd].a[i][0]]+1<1e-8||b[a_node[hd].a[i][0]]>b[hd]+(100-b[hd])*a_node[hd].a[i][1]/100)
               {
                   q.push(a_node[hd].a[i][0]);
                   b[a_node[hd].a[i][0]]=b[hd]+(100-b[hd])*a_node[hd].a[i][1]/100;
               }
           }
       }
       if(b[t]+1<1e-8)
           printf("IMPOSSIBLE!\n");
       else
           printf("%.2lf\n",m*b[t]/100);
    }
    return0;
}

0 0
原创粉丝点击