HDU 4318 Power transmission

九野的博客,转载请注明出处: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 int
using 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;
}

你可能感兴趣的:(HDU 4318 Power transmission)