WA on #6
查看原帖
WA on #6
351390
gxxjqqiang楼主2024/1/3 13:39

rt

#include<bits/stdc++.h>
#define N 100005
#define M 300005
using namespace std;
int n,m,u0,v0,cnt,cnt2,dfncnt;
int h[N],h2[N],dfn[M],low[M],pt[N],inv[N],stk[N],sz[N],vis[N],fg,top,sum;
map<int,int>mp[N];
struct node{
	int v,nxt;
}e[M],e2[M];
void add(int u,int v){
	e[++cnt].v=v,e[cnt].nxt=h[u],h[u]=cnt;
}
void add2(int u,int v){
	e2[++cnt2].v=v,e2[cnt2].nxt=h2[u],h2[u]=cnt2;
}
void tarjan(int u){
	dfn[u]=low[u]=++dfncnt;
	stk[++top]=u;vis[u]=1;
	for(int i=h[u];i;i=e[i].nxt){
		int v=e[i].v;
		if(vis[v]==2)continue;
		if(!vis[v])tarjan(v);
		low[u]=min(low[u],low[v]);
	}
	if(dfn[u]==low[u]){
		int p;cnt++;
		while(stk[top+1]^u)
		p=stk[top--],sz[cnt]++,vis[p]=2,pt[p]=cnt;
	}
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{scanf("%d%d",&u0,&v0);add(u0,v0);}cnt=0;
	for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);
	for(int i=1;i<=n;i++){
		for(int j=h[i];j;j=e[j].nxt){
			int v=e[j].v;
			if(mp[pt[i]][pt[v]])continue;
			if(pt[i]^pt[v]){
				add2(pt[i],pt[v]);
				inv[pt[v]]++,mp[pt[i]][pt[v]]=1;
			}
		}
	}
	for(int i=1;i<=cnt;i++)
	{sum+=(inv[i]==0);}
	for(int i=1;i<=cnt;i++){
		bool flag=1;
		for(int j=h2[i];j;j=e2[j].nxt){
			if(inv[pt[e2[j].v]]<2)flag=0;
		}if(flag&&!inv[i]&&sz[i]==1)fg=1;
	}sum-=fg;
	double ans=1-(double)sum/n;
	return printf("%.6lf",ans),0;
}
2024/1/3 13:39
加载中...