Cow Contest

Cow Contest

floyd求传递闭包

SCUACM2022集训前训练-图论 - Virtual Judge (vjudge.net)

若 a 大于 b,则连一条 a - > b 的边,一个点能走到的点就是比它小的点

跑一遍 floyd,就可知道任意两个点的大小关系

枚举 i, j,如果 i > j 或 i < j 就说明 i,j 的关系是可以判断的;如果所有的 j 都可以与 i 判断,则 i 这个点的次序就固定了,答案++

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>

using namespace std;
typedef long long ll;
const int N = 1e2 + 10;

bool f[N][N];
int n, m;

void floyd()
{
	for (int k = 1; k <= n; k++)
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= n; j++)
				f[i][j] |= f[i][k] & f[k][j];
}
int main()
{
	ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
	cin >> n >> m;
	while(m--)
	{
		int a, b;
		cin >> a >> b;
		f[a][b] = true;
	}
	
	floyd();
	
	int ans = 0;
	for (int i = 1; i <= n; i++)
	{
		int t = 1;
		for (int j = 1; j <= n; j++)
		{
			if (i == j)
				continue;
			t &= f[i][j] | f[j][i];
		}
		ans += t;
	}
	cout << ans << endl;
	return 0;
}

posted @ 2022-05-25 21:47  hzy0227  阅读(20)  评论(0编辑  收藏  举报