题目链接: D. Robots 题目
这一题应该是比较常规的期望dp,但是比赛的时候被b题卡到飞起,当然这题就没有出。。。。
拓扑序和dfs都能解决,于是写了个dfs,记得及时回溯就好啦。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<set>
#include<deque>
#include<map>
#include<vector>
#include<cmath>
#define ll long long
#define llu unsigned ll
using namespace std;
const ll lnf=0x3f3f3f3f3f3f3f3f;
const int inf = 0x3f3f3f3f;
const int maxn=200100;
const int mod=1e9+7;
int head[maxn],ver[maxn],nt[maxn],d[maxn];
double t[maxn],dp[maxn];
int tot=1;
int n,m;
void init(int n)
{
for(int i=1;i<=n;i++)
{
head[i]=d[i]=0;
t[i]=dp[i]=0;
}
tot=1;
}
void add(int x,int y)
{
ver[++tot]=y,nt[tot]=head[x],head[x]=tot;
d[x]++;
}
void dfs1(int x)
{
if(x==n) return ;
if(t[x]) return ;
double ans=0;
for(int i=head[x];i;i=nt[i])
{
int y=ver[i];
dfs1(y);
ans+=t[y];
}
t[x]=(ans+d[x]+1)/d[x];
return ;
}
void dfs2(int x)
{
if(x==n) return ;
if(dp[x]) return ;
double ans=0;
for(int i=head[x];i;i=nt[i])
{
int y=ver[i];
dfs2(y);
ans+=dp[y];
}
dp[x]=(ans+(d[x]+1)*t[x])/d[x];
return ;
}
int main(void)
{
int t;
scanf("%d",&t);
while(t--)
{
int x,y;
scanf("%d%d",&n,&m);
init(n);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
add(x,y);
}
dfs1(1);
dfs2(1);
printf("%.2f\n",dp[1]);
}
return 0;
}