POJ

题意:

n个点,m条边。

若A 到 B的边存在,则证明 A 的排名一定在 B 前。

最后求所有点中,排名可以确定的点的个数。

n <= 100, m <= 4500

刚开始还在想是不是拓扑排序。

n这么小的数据范围,典型的传递闭包。直接可以用Floyd求。

求出传递闭包之后找哪些点与其他所有点都有直接关系,即所有的点和它之间排名都可以确定。计入答案。

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;

#define maxn 100 + 10


int main()
{
    int n, m, a[maxn][maxn];
    scanf("%d%d", &n, &m);

    memset(a, 0, sizeof(a));

    for (int i = 1; i <= m; i++)
    {
        int u, v;
        scanf("%d%d", &u, &v);
        a[u][v] = 1;
    }

    for (int k = 1; k <= n; k++)
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= n; j++)
                if (a[i][k] && a[k][j]) a[i][j] = 1;

    int ans = 0;
    for (int i = 1; i <= n; i++)
    {
        bool flag = true;
        for (int j = 1; j <= n; j++)
            if (i != j && !a[j][i] && !a[i][j]) flag = false;

        if (flag) ans++;
    }

    printf("%d
", ans);
}
原文地址:https://www.cnblogs.com/ruthank/p/9359966.html