绿豆蛙的归宿

绿豆蛙的归宿

dis[i]表示从i到n的期望距离;

反向建图后,dis[n]=0;

求dis[1];

转移方程:dis[v]+=(dis[u]+w)/deg[v];📅

#include<bits/stdc++.h>
using namespace std;
template <typename T>inline void rd(T &x){x=0;char c=getchar();int f=0;while(!isdigit(c)){f|=c=='-';c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}x=f?-x:x;}
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define dwn(i,a,b) for(int i=(a);i>=(b);--i)
#define mem(a,b) memset(a,b,sizeof(a))
#define ee(i,u) for(int i=head[u];i;i=e[i].next)

const int N=1e5+10;

struct edge{
	int v,w,next;
}e[N<<1];

int head[N],edge_num;
inline void adde(int u,int v,int w){
	e[++edge_num].v=v;e[edge_num].w=w;e[edge_num].next=head[u];head[u]=edge_num;
}
int n,m;
int deg[N],out[N];//out用作拓扑排序减
double dis[N];

queue<int>q;
inline void topo(){
	q.push(n);
	while(!q.empty()){
		int u=q.front();q.pop();
		ee(i,u){
			int v=e[i].v,w=e[i].w;
			dis[v]+=(dis[u]+w)/deg[v];
			if(--out[v]==0)q.push(v);
		}
	}
}

int main(){
	#ifdef WIN32
	freopen("test.txt","r",stdin);
	#endif
	rd(n),rd(m);
	rep(i,1,m){
		int u,v,w;rd(u),rd(v),rd(w);
		adde(v,u,w);//注意是反向建边
		deg[u]++,out[u]++;
	}
	topo();
	printf("%.2lf",dis[1]);
	return 0;
}
posted @ 2019-10-10 20:00  设计涉及社稷  阅读(107)  评论(0)    收藏  举报