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