POJ 3660 COW CONTEST(传递闭包)

思路:
用0,1来存储两者之间的输赢关系,利用Floyd动态规划的思想,通过借助中间点来判断两者之间是否有输赢关系,并进行更改,对每个点进行查询,若与其有输赢关系的点为n个(初始化时我们默认自己与自己有输赢关系),则答案加一。在其中判断条件时我们有一点要注意,对于两点之间的输赢关系来说,a[i][j]与a[j][i]之间有一个为1即说明存在输赢关系,可以确定其所在位置,因为我们并不是要来确定他的大小位置是多少,我们只是要确定能否确定其大小位置。

#define _CRT_SECURE_NO_WARNINGS

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<map>
#include<cstdio>
#include<cmath>
#include<iomanip>
#include<sstream>
#include<queue>

#define pi 3.1415926535
#define me(a,b,c) memset(a,b,sizeof c)

#define eps 0.00000001
//#define x first
//#define y second

using namespace std;

typedef long long ll;
const int mod = 1e9 + 7;
typedef pair<int, int> pii;
const int N = 3020;

int n, m, k;
int t;
int g[110][110];
void floyd() {
	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() {
	
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= n; j++)
		{
			if (i == j)g[i][j] = 1;
			else g[i][j] = 0;
		}
	}
	for (int i = 1; i <= m; i++) {
		int a, b;
		cin >> a >> b;
		g[a][b] = 1;
	}

	floyd();
	int ans = 0;
	for (int i = 1; i <= n; i++)
	{
		int tmp = 0;
		for (int j = 1; j <= n; j++) {
			if (g[i][j] || g[j][i])tmp++;
		}
		if (tmp == n)ans++;
	}
	cout << ans << endl;
}
// 
//Buddha blesses the code with no bugs
//                            _ooOoo_
//                           o8888888o
//                           88" . "88
//                           (| -_- |)
//                           O\  =  /O
//                        ____/`---'\____
//                      .'  \|     |//  `.
//                     /  \|||  :  |||//  \
//                    /  _||||| -:- |||||-  \
//                    |   | \\  -  /// |   |
//                    | \_|  ''\---/''  |   |
//                    \  .-\__  `-`  ___/-. /
//                  ___`. .'  /--.--\  `. . __
//               ."" '<  `.___\_<|>_/___.'  >'"".
//              | | :  `- \`.;`\ _ /`;.`/ - ` : | |
//              \  \ `-.   \_ __\ /__ _/   .-` /  /
//         ======`-.____`-.___\_____/___.-`____.-'======
//                            `=---='
//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值