https://nanti.jisuanke.com/t/41301
#include <bits/stdc++.h>
#define MAXN 200005
using namespace std;
int T,n,m;
double step[MAXN],cost[MAXN];
int fsoutway[MAXN];
vector<int>fway[MAXN];
vector<int>zway[MAXN];
void init(int n)
{
for(int i = 1; i<=n; i++) {
step[i] = 0;
cost[i] = 0;
fway[i].clear();
zway[i].clear();
fsoutway[i] = 0;
}
}
int main()
{
scanf("%d",&T);
while(T--) {
scanf("%d%d",&n,&m);
init(n);
for(int i = 1; i<=m; i++) {
int a,b;
scanf("%d%d",&a,&b);
fway[b].push_back(a);
zway[a].push_back(b);
}
queue<int> check;
check.push(n);
while(!check.empty()) {
int p = check.front();
//cout<<"p = "<<p<<endl;
check.pop();
double pstep = 0,pcost = 0;
///-///
for(int i = 0;i<(int)zway[p].size();i++){
pstep+=step[zway[p][i]]+1.0;
}
pstep+=1.0;
if(zway[p].size() == 0){
pstep = 0;
}else{
pstep/=(double)zway[p].size();
}
step[p] = pstep;
///-///
for(int i = 0;i<(int)zway[p].size();i++){
pcost+=cost[zway[p][i]]+step[zway[p][i]]+1.0;
}
pcost+=step[p]+1.0;
if(zway[p].size() == 0){
pcost = 0;
}else{
pcost/=(double)zway[p].size();
}
///-///
cost[p] = pcost;
for(int i = 0;i<(int)fway[p].size();i++){
fsoutway[fway[p][i]]++;
if((int)zway[fway[p][i]].size() == fsoutway[fway[p][i]]){
check.push(fway[p][i]);
}
}
//cout<<"step["<<p<<"] = "<<step[p]<<endl;
//cout<<"cost["<<p<<"] = "<<cost[p]<<endl;
}
printf("%.2f\n",cost[1]);
}
return 0;
}