targan求调
查看原帖
targan求调
555617
Targanzqq楼主2024/6/27 09:59
#include<bits/stdc++.h>
#define int long long
using namespace std;

struct targanzqq{
	stack<int> st;
	int dfn[100001],low[100001],in[100001],vis[100001],sz[100001];
	vector<int> t[100001],scc[100001];
	int tot,cnt;
	void find(int now){
		dfn[now]=++tot;
		low[now]=tot;
		vis[now]=1;
		st.push(now);in[now]++;
		for(auto i:t[now]){
			if(!dfn[i]){
				find(i);
				low[now]=min(low[now],low[i]);
			}
			else if(in[i]){
				low[now]=min(low[now],dfn[i]);
			}
		}
		if(dfn[now]==low[now]){
			int y,siz=0;cnt++;
			do{
				y=st.top();
				in[y]=0;
				siz++;
				st.pop();
				scc[cnt].push_back(y);
			}while(y!=now);
			sz[cnt]=siz;
		}
	}
}targan; 

int n,m,fst[100001],dg[100001],dg2[100001];
vector<int> ans[100001]; 

signed main(){
	ios::sync_with_stdio(false);
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int a,b;
		cin>>a>>b;
		targan.t[a].push_back(b);
		dg[a]++;
	}
	for(int i=1;i<=n;i++){
		if(!targan.vis[i]){
			targan.find(i);
		}
	} 
	int res=0,ans=0;
	for(int i=1;i<=targan.cnt;i++){
		for(auto j:targan.scc[i]){
			dg2[i]+=dg[j];
			//cout<<j<<" "; 
		}
		//cout<<endl;
		if(dg2[i]==0&&res){
			ans=0;break;
		}
		if(dg2[i]!=0)continue;
		ans=targan.sz[i];
		res=i;
	}
	cout<<ans;
}

一直是48pts

2024/6/27 09:59
加载中...