HDU6109 数据分割 【并查集+启发式】
来源:互联网 发布:淘宝商务男装品牌 编辑:程序博客网 时间:2024/06/07 18:58
传送门
#include<stdio.h>#include<bits/stdc++.h>#define ll long long#define pii pair<int,int>#define pll pair<ll,ll>#define MEM(a,x) memset(a,x,sizeof(a))#define lowbit(x) ((x)&-(x))using namespace std;const int N = 100000 + 5;const double EPS = 1e-7;struct S{ int same[N]; set<int>unSame[N]; void init(int n){ for(int i=0;i<=n;++i){ unSame[i].clear(); same[i]=i; } } void init(set<int>&t){ initSame(t); initUnSame(t); } void initSame(set<int>&t){ for(int x:t){ same[x]=x; } } void initUnSame(set<int>&t){ for(int x:t){ unSame[x].clear(); } } int find(int x){ return x==same[x]?x:(same[x]=find(same[x])); } bool isSame(int x,int y){ x=find(x); y=find(y); return same[x]==same[y]; } bool isUnSame(int x,int y){ x=find(x),y=find(y); /*return (unSame[x].find(y)!=unSame[x].end()|| unSame[y].find(x)!=unSame[y].end());*/ set<int>&big=unSame[x]; set<int>&small=unSame[y]; if(big.size()<small.size()){ swap(big,small); swap(x,y); } for(int t:small){ if(x==find(t)){ return true; } } return false; } void merge(int x,int y){ x=find(x); y=find(y); same[max(x,y)]=min(x,y); set<int>&big=unSame[x]; set<int>&small=unSame[y]; if(big.size()<small.size()){ swap(big,small); swap(x,y); } for(int t:small){ big.insert(find(t)); } small.clear(); swap(unSame[find(x)],big); } void setXunSameY(int x,int y){ x=find(x); y=find(y); unSame[x].insert(y); unSame[y].insert(x); }}s;set<int>appear;void slove(int n){ s.init(n); vector<int>ans; appear.clear(); int num=0; for(int i=0;i<n;++i){ int x,y,e; scanf("%d%d%d",&x,&y,&e); x=s.find(x),y=s.find(y); appear.insert(x); appear.insert(y); ++num; if(e){//x==y if(s.isUnSame(x,y)){ ans.push_back(num); num=0; s.init(appear); } else{ s.merge(x,y); } } else{ if(s.isSame(x,y)){ ans.push_back(num); num=0; s.init(appear); } else{ s.setXunSameY(x,y); } } } printf("%d\n",ans.size()); for(int t:ans){ printf("%d\n",t); }}int main(){ //freopen("/home/lu/code/r.txt","r",stdin); //freopen("/home/lu/code/w.txt","w",stdout); int n; while(~scanf("%d",&n)){ slove(n); } return 0;}
阅读全文
2 0
- HDU6109 数据分割 【并查集+启发式】
- hdu6109 数据分割【并查集+set】
- hdu6109(并查集+启发式合并)
- hdu6109数据分割(并查集+set)
- HDU6109-数据分割
- 并查集的启发式合并
- hdu 6109 数据分割(并查集,倍增)
- HDU 6109 数据分割(并查集+缩点)
- hdu 6109 数据分割(并查集+set合并)
- hdu 6109 数据分割(并查集+set合并)
- 并查集的启发式合并 和 路径压缩
- 并查集——启发式合并,路径压缩
- BZOJ_P2733/Codevs_P1477 [HNOI2012]永无乡(Treap+启发式合并+并查集)
- [BZOJ2733][HNOI2012]永无乡(并查集+splay启发式合并)
- 【bzoj4537】【HNOI2016】【最小公倍数】【并查集+启发式合并+分块】
- poj 1611 The Suspects(启发式式合并,并查集)
- 并查集(路径压缩 && 启发式合并!!!)
- 并查集的优化---路径压缩与启发式合并
- 寻找大富翁
- docker容器与镜像管理方法
- python中的非阻塞使用互斥锁
- C语言中你不知道的事——柔性数组
- 系统编程之进程间通信和信号量(售票系统)
- HDU6109 数据分割 【并查集+启发式】
- 在QGraphicsScene中限制图元的拖动范围
- Eclipse+Maven搭建Struts2+Spring+Hibernate项目
- ar
- 说说makefile那些事
- leetcode 72. Edit Distance
- 多线程的全局变量与局部变量
- 用Python满足满足自己的“小虚荣”
- [简单逻辑学]学习逻辑学的思想准备——观念联系事实