WA求助
查看原帖
WA求助
252549
Iwara楼主2024/10/17 18:02

RT

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MAXN=7e5+5;
ll n,m;
ll x,y;
map<pair<ll,ll> ,bool> mp;
struct edge{
	ll u,v,nxt;
}e[MAXN],dag[MAXN];
ll head[MAXN],edge_num;
ll dag_head[MAXN],edge_dag;
void add_edge(ll From,ll To){
	e[++edge_num]=(edge){From,To,head[From]};
	head[From]=edge_num;
	return;
}
ll in[MAXN];
void add_dag(ll From,ll To){
	dag[++edge_dag]=(edge){From,To,dag_head[From]};
	dag_head[From]=edge_num;
	in[To]++;
	return;
}
ll dfn[MAXN],low[MAXN],cnt;
ll st[MAXN],top;
bool in_st[MAXN];
ll scc[MAXN],sz[MAXN];
void tarjan(ll now){
	dfn[now]=low[now]=++cnt;
	st[++top]=now;
	in_st[now]=1;
	for(int i=head[now];i;i=e[i].nxt){
		if(!dfn[e[i].v]){
			tarjan(e[i].v);
			low[now]=min(low[now],low[e[i].v]);
		}
		else if(in_st[e[i].v])low[now]=min(low[now],dfn[e[i].v]);
	}
	if(dfn[now]==low[now]){
		ll pos;
		while(pos=st[top--]){
			scc[pos]=now;
			in_st[pos]=0;
			sz[now]++;
			if(pos==now)break;
		}
	}
	return;
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		cin>>x>>y;
//		if(mp[make_pair(x,y)])continue;
		mp[make_pair(x,y)]=1;
		add_edge(x,y);
	}
	for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);
	mp.clear();
	for(int i=1;i<=m;i++){
		if(scc[e[i].u]==scc[e[i].v])continue;
		if(mp[make_pair(scc[e[i].u],scc[e[i].v])])continue;
		mp[make_pair(scc[e[i].u],scc[e[i].v])]=1;
		add_dag(scc[e[i].u],scc[e[i].v]);
	}
	bool fl=1;
	ll res=0;
	for(int i=1;i<=n;i++){
		if(scc[i]!=i)continue;
		if(!in[i])res++;
		if(in[i]||sz[i]>1)continue;
		if(fl){
			bool qwq=1;
			for(int j=dag_head[i];j;j=dag[j].nxt){
				if(in[dag[j].v]<=1){
					qwq=0;
					break;
				}
			}
			if(qwq)res--,fl=0;
		}
	}
	cout<<fixed<<setprecision(6)<<((double)(n-res)/n);
	return 0;
} 
2024/10/17 18:02
加载中...