当前位置 : 主页 > 网络编程 > PHP >

hdu6109 数据分割【并查集+set】

来源:互联网 收集:自由互联 发布时间:2023-09-06
题目链接:​​http://acm.hdu.edu.cn/showproblem.php?pid=6109​​​ 题意:中文题 解析:由于相等具有传递性,那么可以选择用并查集来维护,即若干个相等的就是一堆,那么对于不等号来说,


题目链接:​​http://acm.hdu.edu.cn/showproblem.php?pid=6109​​​
题意:中文题
解析:由于相等具有传递性,那么可以选择用并查集来维护,即若干个相等的就是一堆,那么对于不等号来说,是无法传递的,于是可以选择用set来维护,比如对于x这个集合来说,里面的所有元素都是与x不等的。这些是对于数据结构的选择,那么有一些要注意的点就是,当你两个相等的元素合并时,其不等的元素也要往父节点合并,不如,x1=y1,x1≠x2,y1≠y2,那么也就有x1≠y2,y1≠x2
主要就是这些,接着边输入边处理即可

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+100;
int fa[maxn];
set<int>s[maxn];
vector<int>ans;
void init(int n)
{
for(int i=0;i<=n;i++)
{
fa[i] = i;
s[i].clear();
}
}
void push_up(int x,int fa)
{
set<int>::iterator it = s[x].begin();
for(;it!=s[x].end();it++)
s[fa].insert(*it);
}
int getfa(int x)
{
if(x==fa[x])
return fa[x];
push_up(x,fa[x]);
return fa[x] = getfa(fa[x]);
}
void merge(int u,int v)
{
int t1 = getfa(u);
int t2 = getfa(v);
if(t1!=t2)
fa[t1] = t2;
}
int main(void)
{
int n;
scanf("%d",&n);
init(n);
int cnt = 0;
for(int i=0;i<n;i++)
{
int x,y,e;
scanf("%d %d %d",&x,&y,&e);
cnt++;
x = getfa(x);
y = getfa(y);
if(e)
{
if(x==y)
continue;
if(s[x].find(y)!=s[x].end() || s[y].find(x)!=s[y].end())
{
ans.push_back(cnt);
cnt = 0;
init(n);
}
else
merge(x,y);
}
else
{
if(x==y)
{
ans.push_back(cnt);
cnt = 0;
init(n);
}
else
{
s[x].insert(y);
s[y].insert(x);
}
}
}
printf("%d\n",ans.size());
for(int i=0;i<(int)ans.size();i++)
printf("%d\n",ans[i]);
return 0;
}


上一篇:poj1287 Networking【最小生成树】
下一篇:没有了
网友评论