【XSY2469】graph 分治 并查集

题目大意

  给你一张\(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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/571136.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云播自带解析php,使用PHP SDK,web端的华为云视频点播接入,加密视频播放的坑与解决方案-全代码篇...

下载phpdemo算是跑起来了&#xff0c;现在就要考虑租户系统如自身验证token的问题了。1、先介绍下我的代码目录2、文件执行的时序图和流程图2、代码demotest.phpfunction curl_request($url,$post,$cookie, $returnCookie0){$curl curl_init();curl_setopt($curl, CURLOPT_URL…

Matlab 常用语法速记 1

快捷帮助 查找帮助&#xff1a;doc 函数名 强制终止&#xff1a; ctrl c 注释&#xff1a; % 清屏 clc&#xff0c;清临时变量窗口 clear NaN: not a number inf: infinite 创建矩阵 列向量&#xff1a;vecx [1 2 3 4]; vecy [1 2 3]; 矩阵&#xff1a;matA [11 12 13 14…

php获取h5视频直链,一种H5播放实时视频的方法与系统与流程

本发明涉及播放实时视频&#xff0c;尤其涉及一种h5播放实时视频的方法与系统。背景技术&#xff1a;h5是指第5代html&#xff0c;也指用h5语言制作的一切数字产品。所谓html是“超文本标记语言”的英文缩写。“超文本”是指页面内可以包含图片、链接&#xff0c;甚至音乐、程序…

移动端中的陀螺仪

横竖屏 window下的orientation属性来表示移动端的横竖屏状态&#xff0c;chrome模拟器不支持该属性&#xff0c;只能在真机上测试 window.orientation 按照上右下左的顺序&#xff0c;该属性的结果分别是0、90、180、-90 [注意]手机头朝下的切换没有实现 window下的orientation…

php 收缩栏,HTML5每日一练之details展开收缩标签的应用

HTML5每日一练之details展开收缩标签的应用details标签的出现&#xff0c;为我们带来了更好的用户体验&#xff0c;不必为这种收缩展开的效果再编写JS来实现。注&#xff1a;目前仅Chrome支持此标签。details有一个新增加的子标签——summary&#xff0c;当鼠标点击summary标签…

博客阅读和思考

1.关于当初 选择说来惭愧&#xff0c;当初选择专业之时&#xff0c;我并没有认真审视过所有专业&#xff0c;没有自己感兴趣的专业方向.是父母帮我选择了软件工程这个方向&#xff0c;他们说IT行业发展前景好&#xff0c;以后不愁工作.我想想&#xff0c;也是这样的.于是稀里糊…

oracle行列互换sql,解决Oracle行列转换问题的一个方法

不好意思&#xff0c;编译错误&#xff0c;可能是版本的问题其实&#xff0c;实现的方法很简单&#xff0c;请参考精华帖子下面是源文件 &#xff0c;我是的数据库版本是9.2.0.1&#xff0c;OS为NT[PHP]---Author: Accelerator---Date : 2004-11-25create or replace type lis…

zufeoj 分数线划定

分数线划定 时间限制: 1 Sec 内存限制: 128 MB提交: 13 解决: 7[提交][状态][讨论版]题目描述 世博会志愿者的选拔工作正在 A 市如火如荼的进行。为了选拔最合适的人才&#xff0c;A市对所有报名的选手进行了笔试&#xff0c;笔试分数达到面试分数线的选手方可进入面试。面试…

php 主进程子进程,PHP中的子进程的任何等价物?

通过双向通信,您可以访问stdin,stdout和stderr的最接近的等价物是proc_open().以下是文档中的示例&#xff1a;$descriptorspec array(0 > array("pipe", "r"), // stdin is a pipe that the child will read from1 > array("pipe", &quo…

oracle只读事物,oracle的只读事务

一致性读是oracle区别于其他数据库的重要特点之一&#xff0c;但一般来说&#xff0c;这个一致性读是sql级别的&#xff0c;只针对单个sql有效。由于业务逻辑需要&#xff0c;我们可能需要在一个事务中的多个sql也能实现读一致性&#xff0c;也就是说&#xff0c;数据源在事务开…

获得网页中元素的位置

网页大小&#xff1a; clientWidth和clientHeight。 最快速的方法&#xff1a;getBoundingClientRect() 获得top, right, bottom, left&#xff0c;是获得元素距离viewport的左上角。 获得元素的相对位置&#xff1a;不断向父元素获得offsetHeight和offsetWidth。 获得元素的绝…

实验一 软件工程准备

1、实验目的与要求 &#xff08;1&#xff09; 学习通过博客园软件开发者学习社区的协作与支持完成软件工程课程学习的技巧和经验。 &#xff08;2&#xff09; 掌握Github操作&#xff1b; 2、实验内容和步骤 任务1&#xff1a;在以下网址提交课程调查问卷&#xff1a;https:/…

matlab气相分解反应动力学,第十二章 化学动力学.ppt

快反应 慢反应 速控法 稳态法 (1) 一级反应 (2) 二级反应 高压时 低压时 RRKM理论 12.7 光化学反应 * 物理化学(下) PHYSICAL CHEMISTRY (11) 碰撞理论 单分子反应理论 过渡态理论 光化学反应 催化反应动力学 本章主要内容&#xff1a; 12 化学动力学基础(二) 反应速率理论 碰撞…

深度学习笔记:优化方法总结(BGD,SGD,Momentum,AdaGrad,RMSProp,Adam)

http://blog.csdn.net/u014595019/article/details/52989301转载于:https://www.cnblogs.com/mdumpling/p/8527799.html

基础题

1&#xff0c;别名&#xff0c;内部&#xff0c;外部&#xff0c;hash优先级&#xff1f; 2&#xff0c;screen协助 1.一台screen -S 协助名称 2.另外一台screen -ls 列出目前开的协助会话&#xff08;session&#xff09;&#xff0c;找到上面协助名称对应的session号。 3. sc…

oracle查询字段精度,【Oracle】查询字段的长度、类型、精度、注释等信息

在mysql中alter命令可以修改字段类型,长度,名称或一些其它的参数,下面我来给大家介绍alter函数修改字段长度与类型的两个命令,希望文章来给各位带来帮助. mysql 修改字段长度 alter table news modify column title varchar(130); alter table 表名 modify column 字段名 …

linux改文件后run,linux下.run文件如何安装与卸载

w 表示可写入&#xff0c;其中 u 表示该档案的拥有者&#xff0c;有个 uninstall 文件&#xff0c; r 表示可读取&#xff0c;利用 chmod 可以藉以控制档案如何被他人所调用。执行./uninstall就ok了 下面是其他网友的补充&#xff1a; 比如安装QT编程软件 安装方法如下 命令第一…

leetcode链表题

1. sort_list Sort a linked list in O(n log n) time using constant space complexity. 分析&#xff1a;时间复杂度是nlogn,所以可以考虑归并排序。取中点&#xff0c;对左边和右边分别递归排序&#xff0c;最后合并。 知识点&#xff1a;快慢指针&#xff0c;用来取链表中点…

linux进程管理之mm_struct,【转】Linux进程管理之SMP负载平衡(续二)

继续来分析balance_tasks()函数,结合代码中的注释,理解这段代码应该很容易,在这里主要分析它的两个重要的子函数,即can_migrate_task()和pull_task().先来看can_migrate_task().该函数用来判断当前进程是否能够迁移到目标cpu上,代码如下:staticint can_migrate_task(struct tas…

分治法求最大最小

分治法的基本思想&#xff1a;是将一个规模为n的原问题分解为k个规模较小的子问题&#xff0c;这些子问题互相独立且与原问题相同。递归地解这些子问题&#xff0c;然后将子问题的解合并为原问题的解。 1 #include<stdio.h>2 /* 分治法计算最大值和最小值的算法程序&…