我不知道为什么大家都写的很复杂,可能是大家在优化,我自己没有想的太深,我觉得题目上说是无环,那么只需通过dfs搜索一下遍历的期望,加起来就行了。应该看过y总的基础课就很容易理解吧,跑出来170多毫秒。
代码如下:
#include<iostream>
#include<cstring>
using namespace std;
const int N = 100005;
const int M = 2 * N;
int e[M], h[M], ne[M], flag, w[M];
int cdu[N];
//建边
void add(int x, int y, int z)
{
e[flag] = y;
w[flag] = z;
ne[flag] = h[x];
h[x] = flag ++;
}
double dfs(int u)
{
double ans = 0;
//便利该点所连接的所有边
for(int i = h[u]; i != -1; i = ne[i]){
int j = e[i];
ans = ans + (w[i] * 1.0 + dfs(j)) / cdu[u];
}
return ans;
}
int main()
{
int n, m;
scanf("%d%d", &n, &m);
memset(h, -1, sizeof h);
while(m --){
int x, y, z;
scanf("%d%d%d", &x, &y, &z);
add(x, y, z);
//出度
cdu[x] ++;
}
double ans = dfs(1);
printf("%.2lf\n", ans);
}