一、传送门
http://acm.hdu.edu.cn/showproblem.php?pid=1704
二、算法分析说明与代码编写指导
对本题而言,将全部输入存储为关系矩阵。于是,如果 A 和 B 之间未直接比赛,但如果能根据一系列已有的比赛结果,确定 A → C1 → C2 → …… → Ck → B,k∈Z,那么 A 和 B 的输赢关系也可以确定。补完传递闭包后,关系矩阵中剩下的为 0 的部分就是不能确定输赢关系的部分。
要求给不出解答的询问数量最多,那么每次询问都要正好问到没能确定输赢关系的那些部分。对除了主对角线(自己不跟自己比)以外的上三角或下三角部分遍历一次,把 0 的项数数出来就可以了。不过有一点要注意,只对对角线以外的上三角或下三角部分扫描时,如果遇到了为 0 的项,还要考察其关于主对角线对称的那一项是否也为 0。若是,才能计入答案中,因为不能确定 A 赢 B 不代表一定不能确定 B 是否赢了 A,也许 B 确实赢了 A。
三、AC 代码
#include<cstdio>
#include<algorithm>
#include<bitset>
#pragma warning(disable:4996)
using namespace std;
const unsigned nmax = 501