码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 3342 Legal or Not

时间:2015-05-06 01:09:04      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:

一道极其水的拓扑排序……但是我还是要把它发出来,原因很简单,连错12次……

题意也很裸,前面的废话不用看,直接看输入

输入n, m表示从0到n-1共n个人,有m组关系

截下来m组,每组输入a, b表示a指向b,或者b指向a也行。

输入n == 0时结束

如果可以拓扑排序,输出"YES",否则输出"NO"。每组输出占一行。

给两种代码吧,一种用邻接矩阵,另一种我也不知道叫什么好……

邻接矩阵——

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cmath>
 4 #include <algorithm>
 5 #include <queue>
 6 using namespace std;
 7 
 8 const int N = 110;
 9 
10 int mp[N][N];
11 int n, m;
12 int a, b;
13 int dg[N];
14 
15 int main()
16 {
17     //freopen("test.txt", "r", stdin);
18     while(~scanf("%d%d", &n, &m) && n)
19     {
20         memset(dg, 0, sizeof(dg));
21         memset(mp, 0, sizeof(mp));
22         for(int i = 0; i < m; i++)
23         {
24             scanf("%d%d", &a, &b);
25             if(mp[a][b] == 0 && a != b)
26             {
27                 dg[b]++;
28                 mp[a][b] = 1;
29             }
30         }
31 
32         queue<int> que;
33         for(int i = 0; i < n; i++)
34         {
35             if(!dg[i]) que.push(i);
36         }
37 
38         int sum = 0;
39         while(!que.empty())
40         {
41             int p = que.front();
42             que.pop();
43             sum++;
44             dg[p]--;
45             for(int i = 0; i < n; i++)
46             {
47                 if(mp[p][i])
48                 {
49                     dg[i]--;
50                     if(!dg[i])
51                     {
52                         que.push(i);
53                     }
54                 }
55 
56             }
57         }
58         if(sum == n) printf("YES\n");
59         else printf("NO\n");
60 
61     }
62     return 0;
63 }

不知名——

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cmath>
 4 #include <algorithm>
 5 #include <queue>
 6 using namespace std;
 7 
 8 const int N = 110;
 9 
10 struct Node
11 {
12     int to;
13     int next;
14 }node[N];
15 
16 int head[N];
17 int dg[N];
18 int n, m;
19 int a, b;
20 
21 int main()
22 {
23     //freopen("test.txt", "r", stdin);
24     while(~scanf("%d%d", &n, &m) && n)
25     {
26         memset(head, -1, sizeof(head));
27         memset(dg, 0, sizeof(dg));
28         for(int i = 0; i < m; i++)
29         {
30             scanf("%d%d", &a, &b);
31             node[i].to = b;
32             node[i].next = head[a];
33             head[a] = i;
34             dg[b]++;
35         }
36 
37         int sum = 0;
38         queue<int>que;
39         for(int i = 0; i < n; i++)
40         {
41             if(!dg[i])
42             {
43                 que.push(i);
44             }
45         }
46 
47         while(!que.empty())
48         {
49             int p = que.front();
50             que.pop();
51             dg[p]--;
52             sum++;
53             for(int i = head[p]; i != -1; i = node[i].next)
54             {
55                 int v = node[i].to;
56                 dg[v]--;
57                 if(!dg[v])
58                 {
59                     que.push(v);
60                 }
61             }
62         }
63         if(sum == n) printf("YES\n");
64         else printf("NO\n");
65     }
66     return 0;
67 }

 

hdu 3342 Legal or Not

标签:

原文地址:http://www.cnblogs.com/mypride/p/4480695.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!