86pts,大艹
查看原帖
86pts,大艹
472950
封禁用户楼主2022/4/9 11:25
#include<bits/stdc++.h>
#define maxn 100005
using namespace std;

map<int,bool>cb[maxn];
int n,m,a[maxn],dfn[maxn],low[maxn],iwc[maxn],wa[maxn],out[maxn],dp[maxn],cnt=1,tot=1,sm;
vector<int>mp[maxn],mp2[maxn];
bool stac[maxn],qd=0;
stack<int>s;

void dfs(int now){
	dfn[now]=low[now]=cnt++;
	stac[now]=1;
	s.push(now);
	for(int o=0;o<mp[now].size();o++){
		if(!dfn[mp[now][o]]){
			dfs(mp[now][o]);
			low[now]=min(low[now],low[mp[now][o]]);
		}
		else if(stac[mp[now][o]]){
			low[now]=min(low[now],low[mp[now][o]]);
		}
	}
	if(dfn[now]==low[now]){
	    int k;
	    do{
	        k=s.top();s.pop();
	        iwc[k]=tot;
	        stac[k]=0;
	        wa[tot]+=a[k];
	    }while(now!=k);
	    tot++;
    }
}

int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		a[i]=1;
	}
	while(m--){
		int nw,nt;
		cin>>nw>>nt;
		mp[nw].push_back(nt);
	}
	for(int i=1;i<=n;i++){
		if(!dfn[i]){
			dfs(i);
		}
	}
	for(int i=1;i<=n;i++){
		for(int o=0;o<mp[i].size();o++){
			if(iwc[i]!=iwc[mp[i][o]]&&cb[iwc[i]][iwc[mp[i][o]]]==0){
				mp2[iwc[i]].push_back(iwc[mp[i][o]]);
				out[iwc[mp[i][o]]]++;
				cb[iwc[i]][iwc[mp[i][o]]]=1;
			}
		}
	}
	tot--;
	for(int ni=1;ni<=tot;ni++){
		if(!out[ni]){
			sm++;
			if(a[ni]==1){
				bool cdi=1;
				for(int o=0;o<mp2[ni].size();o++){
					cdi&=(out[mp2[ni][o]]>=2);
				}
				qd|=cdi;
			}
		}
	}
	printf("%.6lf",((double)(n-sm+qd)/(double)n));
	return 0;
}
2022/4/9 11:25
加载中...