POJ1308(Is It A Tree?)

链接:https://vjudge.net/problem/POJ-1308
思路:放在并查集专题的,思路是每次合并两个点,如果之前已经合并过了那么一定不能构成一棵树,完成之后检查集合的个数是否为1(即图是否连通)。我这题就想换一个写法,没想到关于树的东西还是一直写不好,到处wa,细节抠不好,所以写篇文章总结下坑点:
1、一定要注意空树、单个点、一条链等特殊情况
2、一定要注意是否需要判断图是否连通!(各大赛区已经有很多人栽在这同一个坑点上了)
3、注意是有向边还是无向边,有向边的树上dfs不需要加父节点判断,而无向边一般是需要的(对比这个专题的最后两个题)。
代码:

#include
#include
#include
#include
using namespace std;
const int maxn = 1e5+100;
int vis[maxn],mark[maxn];
vector G[maxn];
int in[maxn];

int a,b;
int flag;

void dfs(int u){
    vis[u] = 1;
    for(int i=0;i

你可能感兴趣的:(POJ1308(Is It A Tree?))