萌新求助,12,20,21该输出0的我输出别的QAQ。大佬救救蒟蒻吧
查看原帖
萌新求助,12,20,21该输出0的我输出别的QAQ。大佬救救蒟蒻吧
362627
frank15楼主2021/2/28 12:54
#include<iostream>
#include<cstdio>
#include<vector>
#include<stack>
using namespace std;
const int maxn=1e4+5;
int n,m,num,tot,ans;
int X[maxn],Y[maxn];
int dfn[maxn],low[maxn];
int sum[maxn],mark[maxn];
int flag=0;
bool vis[maxn];
vector<int> v[maxn],v2[maxn];
stack<int> st;
void dfs(int k){
	dfn[k]=low[k]=++num;
	vis[k]=1;
	st.push(k);
	for(int i=0;i<v[k].size();i++){
		if(!dfn[v[k][i]]){
			dfs(v[k][i]);
			low[k]=min(low[k],low[v[k][i]]);
		}
		else
			if(vis[v[k][i]])
				low[k]=min(low[k],low[v[k][i]]);
	}
	if(dfn[k]==low[k]){
		tot++;
		while(1){
			int TOP=st.top();
			st.pop();
			mark[TOP]=tot;
			sum[tot]++;
			vis[TOP]=0;
			if(k==TOP)
				break;
		}
	}
	return ;
}
void Tarjan(){
	for(int i=1;i<=n;i++)
		if(!dfn[i])
			dfs(i);
	return ;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		scanf("%d%d",&X[i],&Y[i]);
		v[X[i]].push_back(Y[i]);
	}
	Tarjan();
	for(int i=1;i<=m;i++)
		if(mark[X[i]]!=mark[Y[i]])
			v2[mark[X[i]]].push_back(mark[Y[i]]);
	for(int i=1;i<=tot;i++)
		if(!v2[i].size())
			if(flag){
				flag=0;
				break;
			}
			else{
				flag=1;
				ans=sum[i];
			}
	if(flag)
		printf("%d\n",ans);
	else
		puts("0");
}
2021/2/28 12:54
加载中...