程序自动分析 (hash + 并查集)

BZOJ4195

分析

题目中给了相等关系和不等关系,把题目中的元素划为两类。判断是不是可以同时满足其实就是在判断可不可以不交叉的划分成两个部分。因此可以用并查集来解决。同时数据范围又很大,所以想到了映射到map 中用map来解决。

代码

int findfa(int x)
{
	int y = x;
	while(fa[x]!=x) x=fa[x];
	while(fa[y]!=x)
	{
		int t = fa[y];
		fa[y] = x;
		y = t;
	}
	return x;
}
int main ()
{
 	int T;
 	sd(T);
 	while(T--)
 	{
 		int m;
 		sd(m);
 		int cnt = 0;
 		map<int,int>mp;
 		r0(i,m)
 		{
 			sddd(a[i],b[i],e[i]);
 			if(mp.count(a[i])==0) 
 				mp[a[i]]=++cnt;
 			if(mp.count(b[i])==0)
 				mp[b[i]]=++cnt;
 			a[i]=mp[a[i]];
 			b[i]=mp[b[i]]; 
 		}
 		r1(i,cnt)	fa[i] = i;
 		r0(i,m)
 		{
 			if(e[i] == 0) continue;
 			int fx = findfa(a[i]);
 			int fy = findfa(b[i]);
 			if(fx!=fy) fa[fx] =fy;
 		}
 		bool flag = true;
 		r0(i,m)
 		{
 			if(e[i]) continue;
 			int fx = findfa(a[i]);
 			int fy = findfa(b[i]);
 			if(fx == fy)
 			{
 				flag = false;
 				break;
 			}
 		}
 		if(flag) puts("YES");
 		else puts("NO");
 	}
 	return 0;
}
posted @ 2018-10-21 19:25  mvss  阅读(144)  评论(0)    收藏  举报