首页 > 其他分享 >POJ - 1308 Is It A Tree?(并查集)

POJ - 1308 Is It A Tree?(并查集)

时间:2022-11-30 18:14:50浏览次数:58  
标签:point ++ 查集 1308 st int POJ && test

POJ - 1308 Is It A Tree?(并查集)

题目大意:传送门

对于每一组测试样例,给出若干条无向边,判断由这些无向边构成的图是否为无环连通图

题目分析:

要点1:

无环联通图(树)的性质:边数=点数-1。统计点数和边数

要点2:

每次加边,对于这条边的两个顶点,如果这两个点属于同一个集合,那么说明如果将这条边加上的话原图就会成环,即不能构成无环连通图。否则就将这条边加上。

要点3:

此题可能存在空图,空图输出也满足条件


题目代码:

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;

const int N = 1e5 + 10;
int p[N], st[N];
int test = 0;

void init()
{
	for (int i = 1; i <= N - 1; i++)
		p[i] = i;
	memset(st, 0, sizeof st);
}

int find(int x)
{
	if (p[x] != x)
		p[x] = find(p[x]);
	return p[x];
}

void merge(int a, int b)
{
	if (find(a) != find(b))
		p[find(b)] = find(a);
}

int main()
{
	int a, b;
	while (cin >> a >> b)
	{
		init();

		if (a == -1 && b == -1)
			return 0;
		int point = 0, edge = 0;
		if (a == 0 && b == 0)
		{
			printf("Case %d is a tree.\n", ++test);
			continue;
		}
		bool flag = true;
		if (!st[a]) st[a] = 1, point++;
		if (!st[b]) st[b] = 1, point++;
		merge(a, b), edge++;
		while (cin >> a >> b)
		{
			if (a == 0 && b == 0)
				break;

			if (!st[a]) st[a] = 1, point++;
			if (!st[b]) st[b] = 1, point++;
			if (find(a) == find(b))
				flag = false;
			merge(a, b);
			edge++;
		}
		if (flag && edge == point - 1)
			printf("Case %d is a tree.\n", ++test);
		else
			printf("Case %d is not a tree.\n", ++test);
	}
}

标签:point,++,查集,1308,st,int,POJ,&&,test
From: https://www.cnblogs.com/shw940795634/p/16939299.html

相关文章

  • POJ - 1456 Suprtmarket
    POJ-1456Suprtmarket题目大意:传送门有\(n\)个物品,第\(i\)个物品必须要在\(d_i\)天内买完,且卖出该物品可以获得\(p_i\)的利润。一天只能卖一个物品,求最多可以获得多少......
  • POJ-3263 Tallest Cow
    思路分析(摘自这篇博客)这道题目一个核心要点,就是如何处理这些特殊的关系,也就是两头牛互相看见。其实题目中已经告诉我们如何处理,因为我们发现,题目中要求牛的身高最高,那......
  • SPOJLCMSUM - LCM Sum
    简要题意\(T\)组数据,每组数据给出一个\(n\),计算:\[\sum_{i=1}^{n}{\operatorname{lcm}(i,n)}\]\(1\leqT\leq3\times10^5,1\leqn\leq10^{6}\)思路比较快乐的......
  • [模板] 并查集
    并查集structDSU{vector<int>fa,rk;explicitDSU(intn):fa(n+1),rk(n+1){for(inti=1;i<=n;i++)fa[i]=i;}......
  • 29.1308
    #include<stdio.h>#include<math.h>intmain(){intn=0,m=0,i,j,a[10][10];for(i=0;i<3;i++){for(j=0;j<3;j++){scanf("%d",&a[i][j]);}}for(i=0;i<3;i++)n+=a[i]......
  • [并查集 维护大小 全局输入]L2-007 家庭房产
    [并查集]L2-007家庭房产​​题目链接​​思路显然的并查集题目,感觉要维护挺多东西的维护集合最小编号,集合大小,集合房产套数,集合房产面积(人均的到时候除以下大小就完事了)......
  • POJ3252 Round Numbers
    终于一遍就写对了.第一次没有注意读题导致了一个没有注意到什时候要开始统计.Code#include<iostream>#include<string>#defineintlonglongusingnamespacestd;......
  • pat 并查集题目代码详解
    不得不吐槽并查集的题太少了1118:1//一道并查集查询的题目2//需要注意的几个点3//输入的时候在进行合并时,是一个一个输入的,所以需要引入一个变量来存储前一个输......
  • 并查集(草稿)
    最近在尝试参加一些算法比赛,遇到一个并查集的题目,虽然之前学过,但是没怎么刷题所以就忘了,于是花时间开始复习,遇到一些问题记录下来并查集(待补)倒序操作452.序列操作......
  • ABC 214D Sum of Maximum Weights(并查集模拟删边)
    ABC214DSumofMaximumWeights(并查集模拟删边)SumofMaximumWeights​ 给出有\(n\;(2\len\le1e5)\)个点的一棵树,定义\(f(x,y)\)表示从节点x到节点y的最短......