Cow Contest POJ - 3660 Floyd

题解

按照题意所要求的能确定的情况下 其它所有人都要与这个人有联系(能间接性确定他比其它人要强或者没其它人强) 否则无法确定
用Floyd求出每个点是否能到达其它点(比它强) 对行和列求和判断是否大于等于N-1(有时候能到达自身而有时不行)
附dalao样例
5 4
1 3
2 3
3 4
3 5
结果为
1

AC代码

#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;
typedef long long ll;

const int INF = 0x3f3f3f3f;
const int MAXN = 110;
int g[MAXN][MAXN];

void Floyd(int n)
{
	for (int k = 1; k <= n; k++)
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= n; j++)
				g[i][j] |= g[i][k] & g[k][j]; //只需求是否可达 使用位运算
}
int main()
{
#ifdef LOCAL
	freopen("C:/input.txt", "r", stdin);
#endif
	int N, M;
	cin >> N >> M;
	for (int i = 0; i < M; i++)
	{
		int u, v;
		scanf("%d%d", &u, &v);
		g[u][v] = 1;
	}
	Floyd(N);
	int ans = 0;
	for (int i = 1; i <= N; i++)
	{
		int cnt = 0; //如果其它所有点到这个点都有关系则可以确定
		for (int j = 1; j <= N; j++)
			if (g[i][j] || g[j][i])
				cnt++;
		if (cnt >= N - 1) //floyd可能会导致g[i][i]为1
			ans++;
	}
	cout << ans << endl;

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值