hdu 1272 判断所给的图是不是生成树 (并查集)

判断所给的图是不是生成树,如果有重边就不是,如果没重边但连通分量大于1也不是

find函数 用之前那个递归的写的话 会无限栈溢出 Orz

栈溢出的话 就加上这一串

#pragma comment(linker, "/STACK:1024000000,1024000000")

Sample Input
6 8 5 3 5 2 6 4
5 6 0 0

8 1 7 3 6 2 8 9 7 5
7 4 7 8 7 6 0 0

3 8 6 8 6 4
5 3 5 6 5 2 0 0

-1 -1

Sample Output
Yes
Yes
No

 1 # include <iostream>
 2 # include <cstdio>
 3 # include <cstring>
 4 # include <algorithm>
 5 # include <cmath>
 6 # include <queue>
 7 # define LL long long
 8 using namespace std ;
 9
10 const int MAXN=100010;
11 int F[MAXN];
12 bool vis[MAXN] ;
13 int save[MAXN] ;
14 bool flag ;
15 int find(int x)
16 {
17     while(x!=F[x])
18         x=F[x];
19      return x;
20 }
21 void bing(int u,int v)
22 {
23     int t1=find(u);
24     int t2=find(v);
25     if(t1!=t2) F[t1]=t2;
26     else flag = 1 ; //有重边
27 }
28 int main()
29 {
30     //freopen("in.txt","r",stdin) ;
31     int u , v ;
32     while(scanf("%d %d" , &u , &v) != EOF)
33     {
34         if (u == -1 && v == -1)
35             break ;
36         if (u == 0 && v == 0)
37         {
38             printf("Yes\n") ;
39             continue ;
40         }
41          int i ;
42          for(i=1;i<MAXN;i++)
43          {
44              F[i]=i;
45          }
46         memset(vis , 0 , sizeof(vis)) ;
47         F[u] = v ;
48         int l = 0 ;
49         flag = 0 ;
50         if (!vis[u])
51         {
52             vis[u] = 1 ;
53             save[l++] = u ;
54         }
55         if (!vis[v])
56         {
57             vis[v] = 1 ;
58             save[l++] = v ;
59         }
60         while(scanf("%d %d" , &u , &v))
61         {
62             if (u == 0 && v == 0)
63                break ;
64             if (flag)
65                 continue ;
66             if (!vis[u])
67         {
68             vis[u] = 1 ;
69             save[l++] = u ;
70         }
71             if (!vis[v])
72         {
73             vis[v] = 1 ;
74             save[l++] = v ;
75         }
76             bing(u,v) ;
77         }
78         int res = 0 ; //连通分量
79         for (i = 0 ; i < l ; i++)
80             if (F[save[i]] == save[i])
81                 res++ ;
82         if (res >= 2 || flag == 1)
83             printf("No\n") ;
84         else
85             printf("Yes\n") ;
86     }
87     return 0;
88 }

时间: 2024-10-02 11:51:07

hdu 1272 判断所给的图是不是生成树 (并查集)的相关文章

hdu 2120 Ice_cream&#39;s world I(判断是否有环,简单的并查集)

Ice_cream's world I Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 603    Accepted Submission(s): 347 Problem Description ice_cream's world is a rich country, it has many fertile lands. Today,

HDU 1829 &amp;&amp; POJ 2492 A Bug&#39;s Life(种类并查集)

题目地址:HDU 1829     POJ 2492 这个题可以用两种方法做,第一眼看完题是觉得用dfs染色判断二分图.然后又写的刚学的种类并查集.原来并查集可以这样用,真是神奇.. dfs染色代码: #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #include <math.h> #incl

hdu 3081 Marriage Match II(最大流 + 二分 + 并查集)

Marriage Match II                                                                           Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description Presumably, you all have known the question of stable

HDU 4738 Caocao&#39;s Bridges(双联通分量+并查集)

大意:有n座岛和m条桥,每条桥上有w个兵守着,现在要派不少于守桥的士兵数的人去炸桥,只能炸一条桥,使得这n座岛不连通,求最少要派多少人去. 思路:我们就是要缩点后直接求桥上人的最少数量.(PS:1.注意图如果不联通直接输出0.2.如果图中的桥上人为0,个那么要让一个人去.3.重边的问题.这里可以忽略) #include<map> #include<queue> #include<cmath> #include<cstdio> #include<stac

hdu 1829 A Bug&#39;s Life (基础种类并查集)

先说说种类并查集吧. 种类并查集是并查集的一种.但是,种类并查集中的数据是分若干类的.具体属于哪一类,有多少类,都要视具体情况而定.当然属于哪一类,要再开一个数组来储存.所以,种类并查集一般有两个数组,一个存并查集内的父子关系,一个存各个节点所属的种类关系. 以这道题为例(题意在后面,如果没有读题,可以先看完题在来看这部分)—— 这道题很明显,将bug分成两类,一公一母.但是实际上我们并不关心它是公的还是母的,只关心它们之间是同性还是异性.所以,我们可以设与并查集的根节点同性的为0,反之为1.所

HDU 4514 湫湫系列故事——设计风景线(并查集+树形DP)

湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 4669    Accepted Submission(s): 853 Problem Description 随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形

UVA - 10004 Bicoloring(判断二分图——交叉染色法 / 带权并查集)

d.给定一个图,判断是不是二分图. s.可以交叉染色,就是二分图:否则,不是. 另外,此题中的图是强连通图,即任意两点可达,从而dfs方法从一个点出发就能遍历整个图了. 如果不能保证从一个点出发可以遍历整个图,那么编程要注意了,应该从每个点出发遍历一次. s2.带权并查集来判断,略复杂.先略过.先上个博客:http://blog.csdn.net/zsc09_leaf/article/details/6727622 c.邻接矩阵,bfs #include<iostream> #include&

HDU 3081:Marriage Match II(二分图匹配+并查集)

http://acm.hdu.edu.cn/showproblem.php?pid=3081 题意:有n个男生n个女生,他们只有没有争吵或者女生a与男生A没有争吵,且女生b与女生a是朋友,因此女生b也可以和男生A过家家(具有传递性).给出m个关系,代表女生a和男生b没有争吵过.给出k个关系,代表女生a与女生b是好朋友.每一轮过家家之后,女生只能选择可以选择并且没选过的男生过家家,问游戏能进行几轮. 思路:因为n<=100,因此支持O(n^3)的算法,挺容易想到是一个二分图匹配的.(出现在我的网络

HDU 3038 How Many Answers Are Wrong 带权并查集

分析:这一题和HDU3047一样,都是带权并查集,求后输入和先输入的冲突个数 然后其实就是用并查集维护一棵树,小的作为大的祖先,然后这棵树每个节点到根的路径权值是相对根节点的距离 这样就可以维护距离限制,判断冲突 #include <cstdio> #include <cstring> #include <queue> #include <set> #include <map> #include <stack> #include &l