两遍DFS求调
查看原帖
两遍DFS求调
690561
违规用户名690561楼主2024/7/12 17:40
#include<bits/stdc++.h>

using namespace std;

bool vis1[10005], vis2[10005];

int n, m, _1, _2, t, d[10005], vis[10005], ans;

vector<int> e1[10005], e2[10005];

void DFS_1(int u){

	vis1[u] = true;

	for(auto v : e1[u]){

		if(!vis1[v]){

			DFS_1(v);

		}

	}

	d[++t] = u;

	return;

}

void DFS_2(int u){

	vis2[u] = true;

	vis[u] = t;

	for(auto v : e2[u]){

		if(!vis2[v]){

			DFS_2(v);	

		}

	}

	return;

}

int main(){

	scanf("%d %d", &n, &m);

	for(int i = 1;i <= m;i++){

		scanf("%d %d", &_1, &_2);

		e1[_1].push_back(_2);

		e2[_2].push_back(_1);

	}

	for(int i = 1;i <= n;i++){

		if(!vis1[i]){

			DFS_1(i);

		}

	}

	t = 0;

	for(int i = n;i >= 1;i--){

		if(!vis2[i]){

			t++;

			DFS_2(i);	

		}

	}/*
	for(int i = 1;i <= n;i++){
		printf("%d ", vis[i]);
	} 
	for(int i = 1;i <= n;i++){
		printf("%d ", d[i]);
	} 
	*/
	if(t >= 2){
		printf("0");
		return 0;
	}

	for(int i = 1;i <= n;i++){

		if(e1[i].size() == 0){

			ans++;

		}

		if(ans >= 2){

			printf("0");

			return 0;

		}

	}

	if(ans == 1){

		printf("1");

	}else if(ans == 0){

		printf("%d", n);

	}else{

		printf("0");

	}
	
	return 0;
}
2024/7/12 17:40
加载中...