[省选模拟赛]path——期望+最短路
设
令
化简一下就是:
然后我们的决策是只选择那些更优的
然后这就像最短路了(其实不像)。
用堆优化的
然后尝试证明一下:
设
那么
我们只需要证明当
显然。
证毕。
其实不看
#include<bits/stdc++.h>
#define N 100005
#define pr pair<double,int>
using namespace std;
inline void rd(int &x){
x=0;char ch=0;int w=0;
while(!isdigit(ch)) ch=getchar(),w|=ch=='-';
while( isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
x=w?-x:x;
}
int n,m;
double f[N],sum[N];
priority_queue<pr> q;
int head[N],cnt,v[N],d[N];
struct nd{int nxt,to;}e[N<<1];
#define For(x) for(int y,i=head[x];(y=e[i].to);i=e[i].nxt)
inline void add(int x,int y){
e[++cnt]=(nd){head[x],y};head[x]=cnt;
e[++cnt]=(nd){head[y],x};head[y]=cnt;
}
void DJ(){
while(q.size()){
int x=q.top().second;q.pop();
if(v[x]) continue; v[x]=1;
For(x) if(!v[y]){
d[y]++;sum[y]+=f[x];f[y]=(sum[y]+m)/d[y];
q.push(pr(-f[y],y));
}
}
}
signed main(){
rd(n);rd(m);
for(int x,y,i=1;i<=m;i++)
rd(x),rd(y),add(x,y);
q.push(pr(0,n));DJ();
printf("%.10lf",f[1]);
}