82pts求助!悬关!!
查看原帖
82pts求助!悬关!!
1152177
Kuromi0212楼主2024/12/3 22:36
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int n,m;
vector <int> g[maxn],gt[maxn],a;
int dfn[maxn],low[maxn],scc[maxn],e[maxn],scnt,dfnl;
int s[maxn],t,ins[maxn],siz[maxn];
map <pair<int,int>,int> ee;
void tarjan(int u){
	dfn[u]=low[u]=++dfnl;
	s[++t]=u;ins[u]=1;
	for(int v: g[u]){
		if(!dfn[v]){
			tarjan(v);
			low[u]=min(low[u],low[v]);
		}
		else if(ins[v]){
			low[u]=min(low[u],dfn[v]);
		}
	}
	if(dfn[u]==low[u]){
		++scnt;
		while(true){
			int x=s[t--];
			ins[x]=0;
			scc[x]=scnt;
			siz[scnt]+=1;
			if(u==x)break;
		}
	}
	return;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int x,y;
		cin>>x>>y;
		g[x].push_back(y);
	}
	for(int i=1;i<=n;i++){
		if(!dfn[i]){
			tarjan(i);
		}
	}
	for(int i=1;i<=n;i++){
		for(int v:g[i]){
			if(scc[i]!=scc[v]&&ee[{scc[i],scc[v]}]==0){
				gt[scc[i]].push_back(scc[v]);
				e[scc[v]]++;
				ee[{scc[i],scc[v]}]=1;
			}
		}
	}
	for(int i=1;i<=scnt;i++){
		if(e[i]==0&&siz[i]==1){
			a.push_back(i);
		}
	}
	bool flag=false;
	int cn=0;
	for(int i: a){
		cn=0;
		for(int j: gt[i]){
			if(e[j]<2){
				break;
			}
			else{
				cn++;
			}
		}
		if(cn==gt[i].size()){
			flag=true;
			break;
		}
	}
	double ans=0;
	int cnt=a.size();
	if(flag){
		ans=1.0-((cnt-1.0)/n);
	}
	else{
		ans=1.0-((cnt*1.0)/n);
	}
	printf("%.6lf",ans);
}
2024/12/3 22:36
加载中...