P4316 绿豆蛙的归宿
计算长度期望嘛
期望长度 = 长度 * 走这条边的概率
概率很好求
按照拓扑序跑一下DP就好了
设 s [ i ] 为走到这点的概率,j 为 i 的后继节点,k为 i 的后继节点总数
s [ j ] += s[ i ] / k
走边(i,j)的概率显然就是 k
就是期望DP的入门题...
#include<iostream> #include<cstring> #include<cmath> #include<algorithm> #include<cstdio> #include<queue> #include<vector> using namespace std; const int N=100007; vector <int> v[N],g[N]; int n,m; double s[N],ans; queue <int> q; bool vis[N]; int main() { int a,b,c; cin>>n>>m; for(int i=1;i<=m;i++) { scanf("%d%d%d",&a,&b,&c); v[a].push_back(b); g[a].push_back(c); } q.push(1); s[1]=1; while(!q.empty()) { int x=q.front(); q.pop(); int len=v[x].size(); double k=s[x]/len; //cout<<x<<" "<<len<<" "<<s[x]<<" "<<k<<endl; for(int i=0;i<len;i++) { int u=v[x][i]; //cout<<u<<" "; s[u]+=k; ans=(ans+k*g[x][i]); //cout<<s[u]<<" "<<ans<<endl; if(!vis[u]) q.push(u),vis[u]=1; } } printf("%.2lf",ans); return 0; }