1 条题解

  • 0
    @ 2024-4-3 16:29:21
    #include <bits/stdc++.h>
    #define MAXN 100007
    using namespace std;
    struct Edge { int t,w; };
    vector<Edge> G[MAXN];
    int n,m;
    double f[MAXN];
    inline void dfs(int u) {
    	//printf("u = %d\n",u);
    	if (u==n || f[u]!=0) return;
    	int k=(int)G[u].size();
    	for (int i=0;i<(int)G[u].size();i++) {
    		int v=G[u][i].t,w=G[u][i].w;
    		dfs(v),f[u]+=(w+f[v])/k;
    	}
    	//printf("%d -> %.2lf\n",u,f[u]);
    }
    inline int read() {
    	int w=0,X=0; char ch=0;
    	while (!isdigit(ch)) w|=ch=='-',ch=getchar();
    	while (isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
    	return w?-X:X; 
    }
    int main() {
    	n=read(),m=read();
    	for (int i=1;i<=m;i++) {
    		int a=read(),b=read(),c=read();
    		G[a].push_back((Edge){b,c});
    	}
    	dfs(1),printf("%.2lf",f[1]);
    	return 0;
    } 
    
    
    • @ 2024-4-3 16:35:35
      图套期望DP入门题,考虑到整张图是一个有向DAG,可以直接使用递归或者拓扑排序进行状态转移。
       状态转移方程:F[i]=∑F[i]/siz 
       其中i -> j有一条有向边,siz为i的出度
      递归的边界为当前节点为n节点或者是已经计算用的节点(基于DAG的性质可以直接return)
      
  • 1

信息

ID
128
时间
1000ms
内存
128MiB
难度
10
标签
递交数
6
已通过
6
上传者