0
点赞
收藏
分享

微信扫一扫

HDOJ  4318    Power transmission


题目:​​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
{
int number;
int a[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);
}
return 0;
}

举报

相关推荐

0 条评论