题目大意

  给你一张\(n\)个点\(m\)条边的无向图,问删去每个点后,原图是不是二分图。

  \(n,m\leq 100000\)

题解

  一个图是二分图\(\Longleftrightarrow\)该图不存在奇环

  可以用并查集,维护每个点到根的距离

  如果删除\(x\)点,就要把所有不与\(x\)连接的边加入并查集

  考虑分治,对于区间\([l,r]\),我们先把与\([l,mid]\)链接且不与\([mid+1,r]\)链接的边加入并查集,然后递归处理\([mid+1,r]\)。另一边的情况类似。

  因为有撤销操作,所以要用按秩合并的并查集

  时间复杂度:\(O(m\log^2 n)\)

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<utility>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
struct list
{int v[200010];int t[200010];int h[100010];int n;void clear(){memset(h,0,sizeof h);n=0;}void add(int x,int y){n++;v[n]=y;t[n]=h[x];h[x]=n;}
};
list li;
int f[100010];
int s[100010];
int d[100010];
int find(int x)
{return f[x]==x?x:find(f[x]);
}
int getdist(int x)
{return f[x]==x?0:getdist(f[x])^d[x];
}
int e1[100010];
int e2[100010];
int top;
int ans[100010];
int merge(int x,int y)
{int dist=getdist(x)^getdist(y)^1;if((x=find(x))==(y=find(y)))return dist;top++;if(s[x]<=s[y]){e1[++top]=x;e2[top]=y;d[x]=dist;s[y]+=s[x];f[x]=y;}else{e1[++top]=y;e2[top]=x;d[y]=dist;s[x]+=s[y];f[y]=x;}return 0;
}
void solve(int l,int r)
{if(l==r){ans[l]=1;return;}int mid=(l+r)>>1;int now=top;int i,j;int b=1;for(i=l;i<=mid&&b;i++)for(j=li.h[i];j&&b;j=li.t[j])if(li.v[j]<=mid||li.v[j]>r)b^=merge(i,li.v[j]);if(b)solve(mid+1,r);elsefor(i=mid+1;i<=r;i++)ans[i]=0;while(top>now){f[e1[top]]=e1[top];s[e2[top]]-=s[e1[top]];top--;}now=top;b=1;for(i=mid+1;i<=r&&b;i++)for(j=li.h[i];j&&b;j=li.t[j])if(li.v[j]<l||li.v[j]>mid)b^=merge(i,li.v[j]);if(b)solve(l,mid);elsefor(i=l;i<=mid;i++)ans[i]=0;while(top>now){f[e1[top]]=e1[top];s[e2[top]]-=s[e1[top]];top--;}
}
void solve()
{top=0;int n,m;scanf("%d%d",&n,&m);int i;int x,y;li.clear();for(i=1;i<=m;i++){scanf("%d%d",&x,&y);li.add(x,y);li.add(y,x);}for(i=1;i<=n;i++){f[i]=i;s[i]=1;}solve(1,n);for(i=1;i<=n;i++)putchar(ans[i]+'0');putchar('\n');
}
int main()
{
//  freopen("c.in","r",stdin);
//  freopen("c.out","w",stdout);int t;scanf("%d",&t);while(t--)solve();return 0;
}

转载于:https://www.cnblogs.com/ywwyww/p/8511056.html

【XSY2469】graph 分治 并查集相关推荐

  1. CodeForces - 1217F Forced Online Queries Problem(线段树分治+并查集撤销)

    题目链接:点击查看 题目大意:给出 nnn 个点,初始时互相不存在连边,需要执行 mmm 次操作,每次操作分为两种类型: 1xy1 \ x \ y1 x y:如果 (x,y)(x,y)(x,y) 之间 ...

  2. 牛客多校8 - All-Star Game(线段树分治+并查集按秩合并的撤销操作)

    题目链接:点击查看 题目大意:有 n 个球员和 m 个球迷,一个球员可能是多个球迷的粉丝,需要选择最少的球员进行比赛,使得所有的球迷都愿意观看(对于每个球迷来说,都有至少一个其喜欢的球员入选比赛) 对 ...

  3. 【CF#505B】Mr. Kitayuta's Colorful Graph (并查集或Floyd或BFS)

    题干: Mr. Kitayuta has just bought an undirected graph consisting of n vertices and m edges. The verti ...

  4. 越野赛车问题——线段树分治+并查集

    题目 [题目描述] 小 $H$ 是一位优秀的越野赛车女选手.现在她准备在 $A$ 山上进行赛车训练. $A$ 山上一共有 $n$ 个广场,编号依次为 $1$ 到 $n$ ,这些广场之间通过 $n-1$ ...

  5. BZOJ 1018: [SHOI2008]堵塞的交通traffic(线段树分治+并查集)

    传送门 解题思路 可以离线,然后确定每个边的出现时间,算这个排序即可.然后就可以线段树分治了,连通性用并查集维护,因为要撤销,所以要按秩合并,时间复杂度\(O(nlog^2 n)\) 代码 #incl ...

  6. Graph Destruction 并查集,图论(500)

    题意 : 给一n个点m条边的无向图,问逐渐删去1-n点及它们的边,分别输出当前剩下多少个连通区域 思路 : 求连通块,想到了并查集,但并查集是增边,这里是减边,只要倒序考虑问题即可,那么问题转换为 : ...

  7. [BZOJ4320][ShangHai2006]Homework(根号分治+并查集)

    对于<=sqrt(300000)的询问,对每个模数直接记录结果,每次加入新数时暴力更新每个模数的结果. 对于>sqrt(300000)的询问,枚举倍数,每次查询大于等于这个倍数的最小数是多 ...

  8. bzoj4025-二分图【线段树分治,并查集】

    正题 题目链接:https://darkbzoj.tk/problem/4025 题目大意 nnn个点mmm条边,每条边会在一个TTT以内的时间段内出现,对于任意一个TTT以内的时刻求图是否是一个二分 ...

  9. Codeforces 1140F 线段树 分治 并查集

    题意及思路:https://blog.csdn.net/u013534123/article/details/89010251 之前cf有一个和这个相似的题,不过那个题只有合并操作,没有删除操作,直接 ...

最新文章

  1. ni软件可以卸载吗_最强大的电脑端卸载软件!和你想的一样吗?进来看看!
  2. 参数形参错误之 SyntaxError: non-default argument follows default argument
  3. iOS: TableView如何刷新指定的cell 或section
  4. 专家:番茄花园洪磊最高可判刑7年
  5. 《团队-爬取豆瓣电影TOP250-设计文档》
  6. PostgreSQL DBA最常用SQL
  7. 95-10-150-启动-FetchManager
  8. 原力计划·精英季来了!第一周周榜揭晓,你喜欢的博主上榜了吗?
  9. 国际象棋游戏界面和简易棋谱规则-最新Python学习成果
  10. 一个基于WinCE平台的语音识别例子,利用微软speechAPI5.0
  11. SQL入门经典+SQL必知必会
  12. 39. OP-TEE中secure stroage------安全文件数据的打开过程(open)
  13. C# 通用分页用户控件
  14. 简单创意的思维导图怎么画
  15. win10永久关闭自动更新方法
  16. 关于开机USB电涌15秒关机的另类解决方法
  17. 微信公众号的八大价值
  18. 海康威视监控云存储服务器,监控设备,云存储服务器,安防监控—年轻人安防官网...
  19. MySQL教程-01
  20. XML的两种常见格式

热门文章

  1. python中使用什么来实现异常捕捉_Python异常原理及异常捕捉实现过程解析
  2. Java核心篇之HashMap--day6
  3. String StringBuilder StringBuffer三者之间的区别~~~
  4. go 字符串替换_Go语言爱好者周刊:第 64 期 — goup 这个工具了解下
  5. sdp ddp内存怎么分_旗舰手机跑分66万+,缩短与PC差距,手机成生产力工具也许不是梦...
  6. mysql查询缓存到redis_php查询mysql并缓存到redis
  7. php递归 返回数组,php 递归 无限级分类并返回数组的例子
  8. 不用数组,解决众数问题(前提 :众数出现的次数必须大于n/2)
  9. php求链表中位数,先给伸手党的php链表遍历求和
  10. 语言中要输出表格_C语言 | 表格输出若干人的信息