poj3660 Cow Contest

题意:

N个选手,如果A比B强,B比C强,则A必比C强
告知若干个强弱关系,问有多少人的排名可以确定

思路:

如果一个点u, 有x个点能到达此点,从u点出发能到达y个点,若x+y=N-1,则u点的排名是确定的。用floyd算出每两个点之间的距离,最后统计,若dist[a][b] 无穷大且dist[b][a]无穷大,则a和b的排名都不能确定。最后用点个数减去不能确定点的个数即可。

实现:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <set>
 4 using namespace std;
 5 
 6 const int INF = 0x3f3f3f3f;
 7 int n, m, a[105][105], x, y;
 8 int main()
 9 {
10     cin >> n >> m;
11     for (int i = 1; i <= n; i++)
12     {
13         for (int j = 1; j <= n; j++)
14         {
15             a[i][j] = INF;
16         }
17         a[i][i] = 0;
18     }
19     for (int i = 0; i < m; i++)
20     {
21         cin >> x >> y;
22         a[x][y] = 1;
23     }
24     for (int k = 1; k <= n; k++)
25     {
26         for (int i = 1; i <= n; i++)
27         {
28             for (int j = 1; j <= n; j++)
29             {
30                 if (a[i][k] + a[k][j] < a[i][j])
31                 {
32                     a[i][j] = a[i][k] + a[k][j];
33                 }
34             }
35         }
36     }
37     set<int> s;
38     for (int i = 1; i <= n; i++)
39     {
40         for (int j = i + 1; j <= n; j++)
41         {
42             if (a[i][j] == INF && a[j][i] == INF)
43             {
44                 s.insert(i);
45                 s.insert(j);
46             }
47         }
48     }
49     cout << n - s.size() << endl;
50     return 0;
51 }
原文地址:https://www.cnblogs.com/wangyiming/p/6351692.html