源哥每日一题第20弹 poj 1272 还是冰茶集

Posted fengyuzhicheng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了源哥每日一题第20弹 poj 1272 还是冰茶集相关的知识,希望对你有一定的参考价值。

连接:http://acm.hdu.edu.cn/showproblem.php?pid=1272

题意:要 要 要 要啥题意啊就是问题这个东西是不是一颗树

解决方式有很多种,说是冰茶集,但是你用别的方法也可以做啊~

思路:首先作为一棵树一定满足顶点数等于边数+1,但只满足了这个条件也不行(脑补一个圆)判断方法:比方说a和b俩节点,他俩爹要是一样,你再把a和b连上,那不就有环了吗

p.s. 我记得这个题在hdu上会爆栈来着……

还想硬广一下 #pragma comment(linker, "/STACK:1024000000,1024000000")  呢 不开心

 

#include <bits/stdc++.h>

using namespace std;

int pre[100005];
set<int> s;
int f(int x) {
	return x == pre[x] ? x : pre[x] = f(pre[x]);
}
int main() {
	int a, b;
	while (scanf("%d%d",&a,&b) && a+b!=-2) {
		if (a+b==0) {
			puts("Yes"); continue;
		}
		s.clear();
		int ans = 0;
		for (int i = 0; i  <= 100000; i++) {
			pre[i] = i;
		}
		int flag = 0;
		s.insert(a);
		s.insert(b);
		if (a==b) flag = 1;
		else pre[b] = a;
		ans++;
		while(scanf("%d%d",&a,&b) && a+b) {
			s.insert(a);s.insert(b);
			if(a==b || f(a) == f(b)) flag = 1;
			else pre[f(b)] = pre[f(a)];
			ans++;
		}
		if(!flag && ans == s.size() -1) {
			cout << "Yes" << ‘
‘;
		} else {
			cout << "No" << ‘
‘;
		}
	}
	return 0;
}

  

以上是关于源哥每日一题第20弹 poj 1272 还是冰茶集的主要内容,如果未能解决你的问题,请参考以下文章

源哥每日一题第十八弹 poj 1182 并查集

源哥每日一题第十五弹 poj 1190 关于深搜减枝以及对于阅读代码的思考

源哥每日一题第十四弹 hdu 1565 还是状压dp

源哥每日一题第十三弹 百练4124:海贼王之伟大航路 状压dp

爱创课堂每日一题第三十六天- 请你谈谈Cookie的弊端?

备战蓝桥 算法·每日一题(详解+多解)-- day3