HDU 4318 Power transmission

来源:互联网 发布:overlay网络原理 编辑:程序博客网 时间:2024/06/05 03:56

九野的博客,转载请注明出处:http://blog.csdn.net/acmmmm/article/details/11819419

题意:给定n个点,下面n行

i行:

k表示i点连接的边数

i连接的点 边权值

最后一行 起点 终点 输入起点电量

求一条最短路

dij裸题,注意边排序。

用spfa可以防止边排序错误的dij无限TL

#include<iostream>#include<stdio.h>#include<string>#include<string.h>#include<algorithm>#include<map>#include<list>#include<set>#include<vector>#include<queue>#include<iomanip>#include<math.h>#define N 50500#define M 50500*50#define inf 1000000000000#define ll intusing namespace std;inline ll Max(ll a,ll b){return a>b?a:b;}inline ll Min(ll a,ll b){return a<b?a:b;}struct node{ll t,nex;double w;}edge[M];int head[N],edgenum;void addedge(int u,int v,double w){node E={v,head[u],0.01*w};edge[edgenum]=E;head[u]=edgenum++;}ll n,s,t;double all,dis[N];void init(){int k,v;double w;memset(head,-1,sizeof(head));edgenum=0;for(int u=1;u<=n;u++){scanf("%d",&k);while(k--){scanf("%d %lf",&v,&w);addedge(u,v,w);}}scanf("%d %d %lf",&s,&t,&all);for(int i=0;i<=n;i++)dis[i]=1;}struct quedge{int p;double d;quedge(int a=0,double b=0):p(a),d(b){}bool operator<(const quedge& a)const{return a.d<d;}};void dij(){dis[s]=0;priority_queue<quedge> q;q.push(quedge(s,0));//点和已损失率while(!q.empty()){quedge temp=q.top(); q.pop();int u=temp.p; double pow=temp.d;for(int i=head[u];i!=-1;i=edge[i].nex){int v=edge[i].t;if(dis[v]>pow+(1-pow)*edge[i].w){dis[v]=pow+(1-pow)*edge[i].w;if(v!=t)q.push(quedge(v,dis[v]));}}}}int main(){ll i,j,k;while(~scanf("%d",&n)){init();dij();printf("%.2lf\n",dis[t]*all);}return 0;}

原创粉丝点击