poj 3660 传递闭包 **

时间:2021-12-05 22:44:54

题意:题目给出了m对的相对关系,求有多少个排名是确定的。

链接:点我

如果这个点到其他点的关系是确定的,那么这个点就是确定的,注意如果这个点到不了其他点,但其他点能到这个点,那么这个点和其他点的关系是确定的

样例图:

poj 3660 传递闭包 **

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<queue>
 7 #include<map>
 8 using namespace std;
 9 #define MOD 1000000007
10 #define pb(a) push_back(a)
11 const int INF=0x3f3f3f3f;
12 const double eps=1e-5;
13 typedef long long ll;
14 #define cl(a) memset(a,0,sizeof(a))
15 #define ts printf("*****\n");
16 const int MAXN=110;
17 int n,m,tt,cnt;
18 int g[MAXN][MAXN];
19 int main()
20 {
21     int i,j,k;
22     #ifndef ONLINE_JUDGE
23     freopen("1.in","r",stdin);
24     #endif
25     while(scanf("%d%d",&n,&m)!=EOF)
26     {
27         int a,b;
28         cl(g);
29         for(i=0;i<m;i++)
30         {
31             scanf("%d%d",&a,&b);
32             g[a][b]=1;
33         }
34         for(k=1;k<=n;k++)
35             for(i=1;i<=n;i++)
36                 for(j=1;j<=n;j++)
37                     if(g[i][k]==1&&g[k][j]==1)  g[i][j]=1;
38         int tot=0;
39         for(i=1;i<=n;i++)
40         {
41             bool flag=1;
42             for(j=1;j<=n;j++)
43             {
44                 if(i==j)    continue;
45                 if(g[i][j]==0&&g[j][i]==0)
46                 {
47                     flag=0;
48                     break;
49                 }
50             }
51             if(flag)
52             {
53                 tot++;
54             }
55         }
56         printf("%d\n",tot);
57     }
58 }