rt,AT样例1,2过了,3没过,AT上也WA一片。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL maxn=500005;
LL N,M;
LL head[maxn],nxt[maxn],to[maxn],cnt;
LL head2[maxn],nxt2[maxn],to2[maxn],cnt2;
LL deg[maxn],book[maxn];
double f[maxn],G[maxn],ans=1e9+7;
void edge(LL U,LL V){
nxt[++cnt]=head[U];//反边拓扑
to[cnt]=V;head[U]=cnt;
nxt2[++cnt2]=head2[V];//正边
to2[cnt2]=U;head2[V]=cnt2;
return;
}
void Topsort(int e){
memset(f,0,sizeof(f));
memset(book,0,sizeof(book));
queue<int>q;
int T[maxn];
deg[to[e]]--;
for(int i=0;i<=N;i++)T[i]=deg[i];
q.push(N);book[N]=1;
while(!q.empty()){
int x=q.front();q.pop();
for(int i=head[x];i;i=nxt[i]){
if(i==e)continue;
int p=to[i];book[p]=1;
f[p]+=(f[x]+1.0)/deg[p];
T[p]--;
if(T[p]==0)q.push(p);
}
}
deg[to[e]]++;
return;
}
int main(){
cin>>N>>M;
for(int i=1;i<=M;i++){int a,b;cin>>a>>b;edge(b,a);deg[a]++;}
Topsort(0);
int T=0;
for(int i=1;i<=N;i++)
if(deg[i]==1)T++;
if(T==N){cout<<f[1];return 0;}
for(int i=1;i<=N;i++)G[i]=f[i];
for(int i=1;i<=N;i++){
if(deg[i]==1)continue;
T=0;
for(int j=head2[i];j;j=nxt2[j])
if(G[to[j]]>G[to[T]])T=j;
Topsort(T);
ans=min(ans,f[1]);
}
printf("%.11lf",ans);
return 0;
}