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