ybtoj并查集例题2程序自动分析

Posted SSL_ZZL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ybtoj并查集例题2程序自动分析相关的知识,希望对你有一定的参考价值。

【例题2】程序自动分析


Link

传送门
题目


解题思路

这题**的要离散化
虽然不是很难,但是有必要在这么模板的题上加个离散化吗,有!必!要!吗!

将 ‘等于’ 和 ‘不等于’ 分开处理
先处理‘等于’,做并查集
再处理‘不等于’,如果‘不等于’的两个点出现在同个集里,说明两个点既 ‘等于’ 又 ‘不等于’,出现不满足


Code

#include <algorithm>
#include <iostream>
#include <cstdio>

using namespace std;

struct demo{
	int s, i, x;
}sor[2001000];
struct DT{
	int x, y, e;
}a[1001000], no[1001000];
int flag, num, T, n, sum; 
int fa[1001000], e, x, y, xx, yy;

bool cmp(const demo&k, const demo&l) {
	return k.s < l.s;
}

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

int main() {
	scanf("%d", &T);
	while(T--) {
		scanf("%d", &n);
		for (int i = 1; i <= n * 2; i++)
			fa[i] = i;
		
		flag = 1, num = sum = 0;
		for(int i = 1; i <= n; i++) {
			scanf("%d %d %d", &a[i].x, &a[i].y, &a[i].e);
			sor[++sum].s = a[i].x, sor[sum].i = i, sor[sum].x = 1;
			sor[++sum].s = a[i].y, sor[sum].i = i, sor[sum].x = 2;
		}
		sort(sor + 1, sor + 1 + n * 2, cmp);
		int k = 0;
		for (int i = 1; i <= n * 2; i++) {
			if (sor[i].s != sor[i - 1].s) 
				k++;
			if (sor[i].x == 1) a[sor[i].i].x = k;
				else a[sor[i].i].y = k;
		}   //以上为离散化[○・`Д´・ ○]
		
		for(int i = 1; i <= n; i++) {
			if (a[i].e == 0)  //把‘不等于’提取出来,先不做
				no[++num].x = a[i].x, no[num].y = a[i].y;
			else {  //‘等于’的点做并查集
				xx = find(a[i].x), yy = find(a[i].y);
				if (xx != yy)
					fa[xx] = yy;
			}
		}
		for(int i = 1; i <= num; i++) {
			xx = find(no[i].x), yy = find(no[i].y);
			if (xx == yy) {  //如果两个‘不等于’的点出现在同一集里
				flag = 0;
				break;
			}
		}
		if (flag) printf("YES\\n");
		else printf("NO\\n");
	}
} 

以上是关于ybtoj并查集例题2程序自动分析的主要内容,如果未能解决你的问题,请参考以下文章

ybtoj并查集例题4食物链

ybtoj并查集例题3银河英雄传说

「并查集」程序自动分析

图论之并查集模板和经典例题分析(Java语言描述)

bzoj4195 [Noi2015]程序自动分析——并查集

BZOJ 4195: [Noi2015]程序自动分析 [并查集 离散化 | 种类并查集WA]