求吊
查看原帖
求吊
754467
f_hxr_楼主2023/8/12 09:44

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;
}
2023/8/12 09:44
加载中...