HDU 1325 拓扑排序

根据题目所给的3个不符合情况的条件,一个个判断图是否符合这3个条件即可

1.不能出现内部环,拓扑排序判断

2.不能有超过1个点的入度为0,因为只有一个树根

3.每个点最多一个入度

这里要注意的一点是这个点的数字是乱给的,所以最大值为8,但实际上不一定有8个点,这里记录一个最大值的参数,和一个总共点数的参数来进行判断即可

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 using namespace std;
 5
 6 const int N = 100005;
 7 int in[N] , first[N] , k , maxn , del , sum;//maxn记录总共的点的个数,del记录删除了的点的个数
 8
 9 struct Edge{
10     int y , next;
11 }e[N<<2];
12
13 void add_edge(int x , int y )
14 {
15     e[k].y = y , e[k].next = first[x];
16     first[x] = k++;
17 }
18
19 void tuopu(int src)
20 {
21     del++;
22     for(int i = first[src] ; i!=-1 ; i=e[i].next){
23         int v = e[i].y;
24         in[v]--;
25         if(!in[v]) tuopu(v);
26     }
27 }
28
29 int main()
30 {
31    // freopen("a.in" , "r" , stdin);
32     int x , y , cas = 0;
33     while(~scanf("%d%d" , &x , &y)){
34         if(x < 0 && y < 0) break;
35
36         memset(first , -1 , sizeof(first));
37         memset(in , -1 , sizeof(in));
38         k = 0 , maxn = 0 , sum = 0;//sum表示总共点的个数
39         int  cnt = 0 , root , flag = 0; //cnt记录有多少节点可以作为顶点了,flag作为判断是否有点超过1个入度
40         while(x != 0 || y!=0){
41             add_edge(x , y);
42             maxn = max(max(maxn , x) , y);
43             if(in[x] < 0) in[x] = 0 , sum++;
44             if(in[y] < 0) in[y] = 0 , sum++;
45             in[y]++;
46             if(in[y] >= 2){
47                 flag = 1;
48             }
49             scanf("%d%d" , &x , &y);
50         }
51        // cout<<"maxn: "<<maxn<<endl;
52         if(flag){
53           //  cout<<"有点超过两个入度 "<<endl;
54             printf("Case %d is not a tree.\n" , ++cas);
55             continue;
56         }
57         for(int i = 1 ; i<=maxn ; i++)
58             if(!in[i]){
59                 root = i;
60                 cnt++;
61                 if(cnt>=2) break;
62             }
63         if(cnt >= 2){
64            // cout<<"有超过两个点可作为树根 "<<endl;
65             printf("Case %d is not a tree.\n" , ++cas);
66             continue;
67         }
68         del = 0;
69         tuopu(root);
70         if(del < sum)
71         {
72            // cout<<"出现内部环 "<<endl;
73             printf("Case %d is not a tree.\n" , ++cas);
74         }
75         else
76             printf("Case %d is a tree.\n" , ++cas);
77     }
78     return 0;
79 }
时间: 2024-11-12 12:06:32

HDU 1325 拓扑排序的相关文章

HDU 4857 拓扑排序 优先队列

n个数,已经有大小关系,现给m个约束,规定a在b之前,剩下的数要尽可能往前移.输出序列 大小关系显然使用拓扑结构,关键在于n个数本身就有大小关系,那么考虑反向建图,优先选择值最大的入度为零的点,这样得到的序列就是从大到小的,最后倒序输出就行了. 写这题的时候头好痛阿肚子好痛阿,再也不想熬夜了,一点效率都没有. /** @Date : 2017-09-29 19:29:12 * @FileName: HDU 4857 拓扑排序 + 优先队列.cpp * @Platform: Windows * @

HDU 5638 拓扑排序+优先队列

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5638 题意: 给你一个DAG图,删除k条边,使得能个得到字典序尽可能小的拓扑排序 题解: 把拓扑排序的算法稍微改一下,如果某个顶点的入度小于k也把它加到优先队列里面去. k减小后队列里面会有些点不满足<=k,直接踢出来就好了. 代码: #include<iostream> #include<cstring> #include<cstdio> #include<

hdu 2647 (拓扑排序 邻接表建图的模板) Reward

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2647 老板给员工发工资,每个人的基本工资都是888,然后还有奖金,然后员工之间有矛盾,有的员工希望比某员工的奖金多,老板满足了所以员工的这种心思,而且老板下午发的总工资最少,问最少是多少?比如 a b 表示a的工资比b要高(高一块钱),当出现a b   b c   c a这种环的时候输出-1 拓扑排序http://www.cnblogs.com/tonghao/p/4721072.html 小指向大

传递 hdu 5961 拓扑排序有无环~

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5961 题目为中文,这里就不描述题意了. 思路: 从题目陈述来看,他将一个有向图用一个邻接矩阵来表示,并且分为两个图P.Q,但是它们是有内在联系的,即:P+Q,抛去方向即为完全图. 题目都是中文,这里就不翻译了.我们可以从题目中知道,如果P.Q均满足传递性,那么P与(Q的反向图)生成的有向图应该无环. 所以,简单一个拓扑排序检查是否有环即可,P.Q合为一张图,跑一遍,这个还是很快的. 时长:3432MS

HDU 4324 (拓扑排序) Triangle LOVE

因为题目说了,两个人之间总有一个人喜欢另一个人,而且不会有两个人互相喜欢.所以只要所给的图中有一个环,那么一定存在一个三元环. 所以用拓扑排序判断一下图中是否有环就行了. 1 #include <cstdio> 2 #include <cstring> 3 4 const int maxn = 2000 + 10; 5 char G[maxn][maxn]; 6 int c[maxn]; 7 int n; 8 9 bool dfs(int u) 10 { 11 c[u] = -1;

HDU 2094 拓扑排序

产生冠军 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 12031    Accepted Submission(s): 5583 Problem Description 有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛. 球赛的规则如下: 如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认定,A一定能

HDU 5438 拓扑排序+DFS

Ponds Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 3234    Accepted Submission(s): 997 Problem Description Betty owns a lot of ponds, some of them are connected with other ponds by pipes, a

hdu 2647(拓扑排序)

Reward Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7231    Accepted Submission(s): 2263 Problem Description Dandelion's uncle is a boss of a factory. As the spring festival is coming , he wa

hdu 1811(拓扑排序+并查集)

Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7961    Accepted Submission(s): 2266 Problem Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为 了更好的符合那些爱好者的喜好,Lele又想