[HIHO1322]树结构判定(并查集)
2016-06-20 19:42
351 查看
题目链接:http://hihocoder.com/problemset/problem/1322
给一个图,判断这个图是不是一棵树。
判定的方法:首先是连通图,其次所有点的入度都小于等于1。
给一个图,判断这个图是不是一棵树。
判定的方法:首先是连通图,其次所有点的入度都小于等于1。
/* ━━━━━┒ギリギリ♂ eye! ┓┏┓┏┓┃キリキリ♂ mind! ┛┗┛┗┛┃\○/ ┓┏┓┏┓┃ / ┛┗┛┗┛┃ノ) ┓┏┓┏┓┃ ┛┗┛┗┛┃ ┓┏┓┏┓┃ ┛┗┛┗┛┃ ┓┏┓┏┓┃ ┛┗┛┗┛┃ ┓┏┓┏┓┃ ┃┃┃┃┃┃ ┻┻┻┻┻┻ */ #include <algorithm> #include <iostream> #include <iomanip> #include <cstring> #include <climits> #include <complex> #include <fstream> #include <cassert> #include <cstdio> #include <bitset> #include <vector> #include <deque> #include <queue> #include <stack> #include <ctime> #include <set> #include <map> #include <cmath> using namespace std; #define fr first #define sc second #define cl clear #define BUG puts("here!!!") #define W(a) while(a--) #define pb(a) push_back(a) #define Rint(a) scanf("%d", &a) #define Rll(a) scanf("%lld", &a) #define Rs(a) scanf("%s", a) #define Cin(a) cin >> a #define FRead() freopen("in", "r", stdin) #define FWrite() freopen("out", "w", stdout) #define Rep(i, len) for(int i = 0; i < (len); i++) #define For(i, a, len) for(int i = (a); i < (len); i++) #define Cls(a) memset((a), 0, sizeof(a)) #define Clr(a, x) memset((a), (x), sizeof(a)) #define Full(a) memset((a), 0x7f7f, sizeof(a)) #define lrt rt << 1 #define rrt rt << 1 | 1 #define pi 3.14159265359 #define RT return #define lowbit(x) x & (-x) #define onenum(x) __builtin_popcount(x) typedef long long LL; typedef long double LD; typedef unsigned long long ULL; typedef pair<int, int> pii; typedef pair<string, int> psi; typedef pair<LL, LL> pll; typedef map<string, int> msi; typedef vector<int> vi; typedef vector<LL> vl; typedef vector<vl> vvl; typedef vector<bool> vb; const int maxn = 505; int n, m; int pre[maxn]; int in[maxn]; int find(int x) { return x == pre[x] ? x : pre[x] = find(pre[x]); } void unite(int x, int y) { x = find(x); y = find(y); if(x != y) pre[x] = y; } int main() { // FRead(); int T; int u, v; Rint(T); W(T) { Rint(n); Rint(m); bool exflag = 0; Cls(in); Rep(i, n+10) pre[i] = i; Rep(i, m) { Rint(u); Rint(v); in[v]++; unite(u, v); } int rt = find(pre[1]); if(in[1] > 1) exflag = 1; For(i, 2, n+1) { if(find(pre[i]) != rt || in[i] > 1) { exflag = 1; break; } } if(exflag) printf("NO\n"); else printf("YES\n"); } RT 0; }
相关文章推荐
- 【Struts 1】Struts1的基本原理和简介
- 【Struts 1】Struts1的基本原理和简介
- 安装swftool过程报错记录
- 第十六周上机实践项目2(1):阅读程序
- Java线程池
- 转:数字签名是什么?(阮一峰)
- java 工厂模式
- 网盘多个账号混淆问题
- JS对象
- ListView或者RecycleView滚动时隐藏Toolbar (1)
- [linux]收集一些好玩的命令
- hibernate二级缓存应用
- TCP三次握手与DDOS攻击原理
- 8-129 绕过形参限制(最简单的模版)
- 点击导航栏,ie8 下内存递增的原因及其解决方法(主要是围绕是否是iframe导致的)
- hdu 1241 搬寝室 水dp
- Android学习路线
- 最后一课
- 第十六周上机实践项目1(3):阅读程序
- JDBC2