源哥每日一题第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" << ‘\n‘;
		} else {
			cout << "No" << ‘\n‘;
		}
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/fengyuzhicheng/p/9201711.html

时间: 2024-10-10 16:22:50

源哥每日一题第20弹 poj 1272 还是冰茶集的相关文章

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

连接:http://bailian.openjudge.cn/practice/4124 题意:从1到n走过所有点恰好一次最短时间.乱搞的话会完美的超时(阶乘级别的复杂度,虽然范围很小,但是也足够超时了). 思路:先想一个不太成熟的思路.用dp[s][j]表示.s记录的是每个点是否被走过的状态.而dp[s][j]表示的是从1走到j状态所用的最小时间.这样的思路成不成立呢?首先,考虑初始值.开始是在1号点,那么dp[1][1]自然就是0了,其他就是max:另外,题面说只要遍历每一个点,而于顺序的话

源哥每日一题第十九弹 poj 2236 还是冰茶集

连接:http://poj.org/problem?id=2236 题意:有一堆坏电脑,和两种操作:O表示修好这台电脑,S 询问两台电脑是否联通.主要是判电脑是否联通:两台电脑间距离小于d就是联通的. 题解:emmm--直接写啊 #include <iostream> #include <cstdio> using namespace std; int n; long long d; int pre[1005]; int jud[1005]; struct coor { long

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

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1565 题意:自己念 分析:有了上一题的基础,这题的状态方程也好想:dp[i][s]表示第i行第s个状态取得的最大值. 可以预处理出每一行每一种状态所能获得的值,方程就是dp[i][j] = max(dp[i][j],dp[i-1][k]+sum[i][j]); 要注意的就是判断相邻的情况:两个状态,如果a&b!=0则表示它们有相重叠的区域. #include <bits/stdc++.h> u

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

题目链接:http://poj.org/problem?id=1182 题意:看不懂?退群吧 比平常的并查集加了一个判断集合间关系的操作: 开一个数组记录当前点所在集合的次序(第几个集合)用012表示 比较简单的思路,不过体现了并查集的精妙 #include <iostream> #include <cstring> #include <cstdio> using namespace std; int dad[500005]; int st[50005]; int fi

&#8203;老男孩教育每日一题-第125天-显示文件oldboy.txt的第20行到30行请问如何做?

显示文件oldboy.txt的第20行到30行请问如何做? echo stu{00..40}|xargs -n1 >oldboy.txt 1.    head -30 oldboy.txt|tail -11 2.    sed -n '20,30p' oldboy.txt 3.    sed -n '20,30!d' oldboy.txt 4.    awk 'NR==20,NR==30' oldboy.txt 5.    awk 'NR>=20 && NR<=30' o

老男孩教育每日一题-第126天-通过shell脚本打印乘法口诀表

问题背景: 生成9*9乘法表 [[email protected] ~]# seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}' 1x1=1 1x2=2   2x2=4 1x3=3   2x3=6   3x3=9 1x4=4   2x4=8   3x4=12  4x4=16 1x5=5

老男孩教育每日一题-第110天-find命令-size参数

老男孩教育每日一题-第110天-find命令-size参数1.查找当前目录下以log结尾的大于50k小于2M的普通文件2.查找当前目录下以log结尾的小于50k大于2M的普通文件以上两个问题有什么不同? 参考答案: 测试环境: [[email protected] tmp]# pwd /root/tmp [[email protected] tmp]# ll -h total 7.4M -rw-r--r-- 1 root root   262 Jul 30 15:45 a.log -rw-r--

老男孩教育每日一题-2017年5月17日-使用三剑客进行变化格式

1.题目 原始数据: 17/Apr/2015:09:29:24 +0800 17/Apr/2015:09:30:26 +0800 17/Apr/2015:09:31:56 +0800 18/Apr/2015:09:34:12 +0800 18/Apr/2015:09:35:23 +0800 19/Apr/2015:09:23:34 +0800 19/Apr/2015:09:22:21 +0800 20/Apr/2015:09:45:22 +0800 期望结果: 2015-04-17 09:29:

老男孩教育每日一题-2017年5月16日-说说{}与[]这两个符号有什么区别?

1.题目 2.参考答案 这两个看似简单的符号,其实内容还不少.我们一起来看看. 2.1 通配符中 通配符在linux中通常用来匹配/找文件名或目录名.最常用的就是 ls -l *.txt显示出所有以.txt结尾的文件. 2.1.1  {} 花括号,大括号,生产序列 [[email protected] regular]# echo {a..z} {0..9} a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8