POJ3275 Ranking the Cows
题意:
有N个数字,已经比较了M对(x,y),其中x>y, 问至少再需要比较多少对数字,就能
把N个数按大小有序的排列起来
分析:
如果x>y,就在x和y之间连一条单向边,然后用floyd算法(floyd传递闭包),
AC代码:
#include <bitset>
#include <cstdio>
using namespace std;
int n, m, a, b, ans;
bitset<1005> bi[1005];//要用bitset来存01矩阵,可以省掉最外面的一层for循环,不然会超时
//bi[i][j] = 1,表示i和j相连(大小确定)
int main()
{
scanf("%d%d", &n, &m);
for(int i = 1; i <= m; ++i)
{
scanf("%d%d", &a, &b);
bi[a][b] = 1;
//注意是单向边,只需要bi[a][b] = 1,不需要bi[b][a] = 1;
}
//floyd算法
for(int i = 1; i <= n; ++i)
{
for(int j = 1; j <= n; ++j)
{
if(i != j)
{
//如果j可以i,则i可以到达的点j都可以到达,所以或一下
if(bi[j][i]) bi[j] |= bi[i];
}
}
}
//找出有多少个点没有相连
//注意第二个循环的其实条件,不然ans会变大
//对于i到j,只要bi[i][j]和bi[j][i]其中一个是1即可表示两点相连,因为连的是单向边
for(int i = 1; i <= n; ++i)
{
for(int j = i + 1; j <= n; ++j)
{
if(!bi[i][j] && !bi[j][i]) ans++;
}
}
printf("%d\n", ans);
return 0;
}

京公网安备 11010502036488号