93 pts for help
查看原帖
93 pts for help
428358
Grisses楼主2022/6/25 10:42

Wa on # 13

#include<bits/stdc++.h>
using namespace std;
int n,m,ans,cnt,tmp,tog,tot,h[100005],in[100005],dfn[100005],low[100005],sig[100005],val[100005];
bool f;
stack<int>S;
struct node{
	int u,v,nxt;
}e[300005];
string _;
vector<int>G[100005];
unordered_map<string,bool>M;
void adde(int u,int v){
	e[++cnt].nxt=h[u];
	h[u]=cnt;
	e[cnt].v=v;
	e[cnt].u=u;
}
void dfs(int x){
	if(dfn[x])return;
	dfn[x]=low[x]=++tot;
	S.push(x);
	for(int i=h[x];i;i=e[i].nxt){
		if(!dfn[e[i].v])dfs(e[i].v),low[x]=min(low[x],low[e[i].v]);
		else if(!sig[e[i].v])low[x]=min(low[x],dfn[e[i].v]);
	}
	if(low[x]==dfn[x]){
		tog++;
		while(1){
			tmp=S.top();
			S.pop();
			sig[tmp]=tog;
			val[tog]++;
			if(tmp==x)break;
		}
	}
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1,u,v;i<=m;i++)scanf("%d%d",&u,&v),adde(u,v);
	for(int i=1;i<=n;i++)dfs(i);
	for(int i=1;i<=m;i++){
		if(sig[e[i].u]!=sig[e[i].v]){
			_=to_string(sig[e[i].u])+' '+to_string(sig[e[i].v]);
			if(!M.count(_)){
				M[_]=1;
				G[sig[e[i].u]].push_back(sig[e[i].v]);
				in[sig[e[i].v]]++;
			}
		}
	}
	for(int i=1;i<=tog;i++){
		if(!in[i]){
		    if(!f){
    			if(val[tog]==1){
    				for(auto v:G[tog]){
    					if(in[v]<2){
    						f=1;
    						break;
    					}
    				}
    				f=!f;
    				if(f)continue;
    			}
    		}
		    ans++;
		}
	}
	printf("%.6lf",double(n-ans)/double(n));
	return 0;
}

kkk=\color{white} kkk= is\color{white} is sb\color{white} sb

2022/6/25 10:42
加载中...