[期望DP] 初试期望DP 绿豆蛙的归宿

绿豆蛙的归宿

Portkey

期望概率DP
考虑
f i = ∑ ( p [ i → j ] f [ j ] + w [ i → j ] ) f_i=\sum (p[i\to j]f[j]+w[i\to j]) fi=(p[ij]f[j]+w[ij])

对于一个点,从它的所有终点走过来
终点期望有累加,边权要考虑
f u = ∑ u → v ( f v + w e ) p e f_u=\sum_{u\to v} (f_v+w_e)p_e fu=uv(fv+we)pe

#include
using namespace std;
#define in Read()
int in{
	int i=0,f=1;char ch=0;
	while(!isdigit(ch)&&ch!='-') ch=getchar();
	if(ch=='-') ch=getchar(),f=-1;
	while(isdigit(ch)) i=(i<<1)+(i<<3)+ch-48,ch=getchar();
	return i*f;
}

const int N=2e5+5;
int n,m;
int tot,first[N],nxt[N],aim[N],wei[N];
double f[N];
int ind[N],siz[N];

void ljb(int u,int v,int w){
	++tot;
	nxt[tot]=first[u];
	first[u]=tot;
	aim[tot]=v;
	wei[tot]=w;
	return;
}

void topo(){
	queue<int>q;
	q.push(n);
	while(!q.empty()){
		int u=q.front();q.pop();
		for(int e=first[u];e;e=nxt[e]){
			int v=aim[e];
			f[v]+=(f[u]+1.0*wei[e])/siz[v];
			if(!(--ind[v])) q.push(v);
		}
	}
	return;
}

int main(){
	n=in,m=in;
	for(int i=1;i<=m;++i){
		int u=in,v=in,w=in;
		ljb(v,u,w);
		++ind[u];
		++siz[u];
	}
	topo();
	printf("%.2lf\n",f[1]);
	return 0;
}

你可能感兴趣的:(#,期望概率DP)