93分求助,第8个点wa
查看原帖
93分求助,第8个点wa
544459
xhz_楼主2022/4/17 21:10
#include<bits/stdc++.h>
using namespace std;
struct edge{
	int nxt,to,len,from;
}e[300001];
int head[100001],cnt=0;
int dfn[100001],low[100001],tim=0,stac[100001],top=0,sd[100001],vis[100001],in[100001],ff[100001];
void add(int u,int v){
	e[++cnt].nxt=head[u];
	head[u]=cnt;
	e[cnt].to=v;
	e[cnt].from=u;
}
void tarjan(int x){
	int y;
	dfn[x]=low[x]=++tim;
	stac[++top]=x;vis[x]=1;
	for(int i=head[x];i;i=e[i].nxt){
		y=e[i].to;
		if(!dfn[y]){
			tarjan(y);
			low[x]=min(low[x],low[y]);
		}else if(vis[y]){
			low[x]=min(low[x],low[y]);
		}
	}
	if(dfn[x]==low[x]){
		while(top){
			y=stac[top--];
			vis[y]=0;
			sd[y]=x;
			if(x==y)return;
		}
	}
} 
int main(){
	int n,m,x,y,flag=1;double ans=0;cin>>n>>m;
	if(n==1){cout<<"1.000000";return 0;}
	for(int i=1;i<=m;i++){
		scanf("%d%d",&x,&y);
		add(x,y);
	}
	for(int i=1;i<=n;i++){
		if(!dfn[i]){
			tarjan(i);
		}
	}
	for(int i=1;i<=m;i++){
		x=sd[e[i].from];y=sd[e[i].to];
		if(x==y)continue;
		if(in[y]==0)in[y]=x;
		else if(in[y]!=x)ff[y]=1;
	}
	bool fl;int tot=0;
	for(int i=1;i<=n;i++){
		if(sd[i]==i&&in[i]==0){
			fl=true;tot=0;
			for(int j=head[i];j;j=e[j].nxt){
				y=sd[e[j].to];tot++;
				if(ff[y]==0){
					fl=false;break;
				}
			}
			if(fl&&tot){
				flag=1;
				break;
			}
		}
	}
	for(int i=1;i<=n;i++){
		if(sd[i]==i&&in[i]==0){
			ans+=1;
		}
	}
	if(ans==1)flag=0;
	//cout<<ans<<endl;
	printf("%0.6f",1.0-(ans-flag)/(double)(n));
	return 0;
}
2022/4/17 21:10
加载中...