前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HDU 6109 数据分割(并查集+set维护)

HDU 6109 数据分割(并查集+set维护)

作者头像
用户2965768
发布2018-08-30 15:07:00
4920
发布2018-08-30 15:07:00
举报
文章被收录于专栏:wymwym

 题目:http://acm.hdu.edu.cn/showproblem.php?pid=6109

题意:给n行数,a,b,e  e为0表示两个数不相等,e为1表示相等。

要求划分数据 ,让每一组数据都不符合,去掉最后一个就符合,

题解:

相等的就在一个集合,集合之间有边表示两个集合不相等

例如给出a,b,e, 并查集初始化后祖先为x,y

若e==1:

  1. x==y时,a==b,在一个集合,不做处理
  2. x!=y,不在一个集合, 若集合x和集合y有边,矛盾 有边表示不相等,但是现在e==1,说明a==b,输出答案(加入队列)
  3. x!=y,不在一个集合,  若集合x和集合y没有边,就合并两个集合

若e==0:

  1. x==y时,两个不相等的数在一个集合,矛盾 ,输出答案,初始化并查集,下一次分割
  2. x!=y , a!=b,两个数不在一个集合,成立,给他们加一条边,以这种方式存储数据
代码语言:javascript
复制
#include <bits/stdc++.h>
using namespace std;
const int maxn=100005;
int f[maxn],a[maxn],b[maxn],e[maxn];
set<int> G[maxn];
vector<int> ans;
int n;
int fa(int x)
{
	return f[x]==x?x:f[x]=fa(f[x]);
}
void init()
{
	for(int i=0;i<n;i++)
	 	f[i]=i,G[i].clear(); 
}
void solve()
{
	int cnt=0;
	for(int i=0;i<n;i++)
		{
			cnt++;
			int x=fa(a[i]),y=fa(b[i]);
			if(e[i])//a==b
			{
				if(x==y)continue;
				else
				{
					if(G[x].find(y)!=G[x].end())//a==b x!=y 相等不在一个集合 
					//集合之间有边   矛盾 
					{
						ans.push_back(cnt);
						cnt=0;
						init();
					}else//集合无边 并查集合并 
					{
						set<int>::iterator it;
						for(it=G[x].begin();it!=G[x].end();it++)
							{//连接x集合的边都删除 连接y 
								G[y].insert(*it);
								G[*it].erase(x);
								G[*it].insert(y);
							}
						G[x].clear();
						f[x]=y;//合并集合 x,y 
					}
				} 
				
			}
			else//a!=b 
			{
				if(x==y)//不相等的数在一个集合 矛盾 
				{
					ans.push_back(cnt);
					cnt=0;
					init();
				}else//不在一个集合  两个集合加一条边 
				{
					G[x].insert(y),G[y].insert(x);
				}
			}
		}
}
int main()
{
	scanf("%d",&n);
	for(int i=0;i<n;i++)scanf("%d %d %d",&a[i],&b[i],&e[i]);
	
	init();
			
	solve();
	int sz=ans.size();
	printf("%d\n",sz);
	for(int i=0;i<sz;i++)
		printf("%d\n",ans[i]);
	return 0;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年08月18日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档