4025: 二分图

Description

神犇有一个n个节点的图。因为神犇是神犇,所以在T时间内一些边会出现后消失。神犇要求出每一时间段内这个图是否是二分图。这么简单的问题神犇当然会做了,于是他想考考你。

Input

输入数据的第一行是三个整数n,m,T。
第2行到第m+1行,每行4个整数u,v,start,end。第i+1行的四个整数表示第i条边连接u,v两个点,这条边在start时刻出现,在第end时刻消失。

Output

输出包含T行。在第i行中,如果第i时间段内这个图是二分图,那么输出“Yes”,否则输出“No”,不含引号。

Sample Input

3 3 3
1 2 0 2
2 3 0 3
1 3 1 2

Sample Output

Yes
No
Yes

HINT

样例说明:
0时刻,出现两条边1-2和2-3。
第1时间段内,这个图是二分图,输出Yes。
1时刻,出现一条边1-3。
第2时间段内,这个图不是二分图,输出No。
2时刻,1-2和1-3两条边消失。
第3时间段内,只有一条边2-3,这个图是二分图,输出Yes。
数据范围:
n<=100000,m<=200000,T<=100000,1<=u,v<=n,0<=start<=end<=T。

Source

【分析】

  %%%大颓果,你可以看她的按秩合并题解:http://blog.csdn.net/u010336344/article/details/55194864

  我打的是最简单那种并查集,每次修改father和dis的时候把操作压入栈里面,回溯的时候恢复并查集。

  【表示第一次恢复并查集,从来没想过这个。。不过并查集时间很快的话应该也不会很耗空间吧?

  我觉得主方法更像整体二分,T给的是一个区间,像线段树一样当完全在[l,r]中的时候进行操作,其余操作分到左右两个区间里面做。

  回溯的时候恢复并查集。

  大概就是这样。

  哦对了,二分图就是看看是否有奇环,有的话一定不是二分图。

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<stack>
using namespace std;
#define Maxn 100010 struct node {int x,y,s,t;};
vector<node > S; int fa[Maxn],dis[Maxn];
bool ans[Maxn]; struct nnode {int x,f,d;};
stack<nnode> sta; void mak_f(int x,int ff,int dd)
{
nnode tt;
tt.x=x;tt.f=fa[x];tt.d=dis[x];
sta.push(tt);
fa[x]=ff;
dis[x]=dd;
} int ffa(int x)
{
if(fa[x]!=x)
{
int ff=ffa(fa[x]);
mak_f(x,ff,(dis[fa[x]]+dis[x])%);//fa[x]=ffa(fa[x]);
}
return fa[x];
} void ffind(int l,int r,vector<node> M)
{
vector<node> ll,rr;
ll.clear();rr.clear();
int mid=(l+r)>>,now=sta.size();
bool ok=;
for(int i=;i<M.size();i++)
{
node t=M[i];
if(t.s==l&&t.t==r)
{
if(ffa(t.x)==ffa(t.y))
{
if(dis[t.x]==dis[t.y]) {ok=;break;}
}
else
{
if(ffa(t.x)!=t.x)
{
mak_f(ffa(t.x),t.x,dis[t.x]);
mak_f(t.x,t.x,);
}
mak_f(t.x,t.y,);
}
}
else if(t.t<=mid) ll.push_back(t);
else if(t.s>mid) rr.push_back(t);
else
{
node tt=t;tt.t=mid;
ll.push_back(tt);tt.s=mid+;tt.t=t.t;
rr.push_back(tt);
}
}
if(l!=r&&!ok)
{
ffind(l,mid,ll);ffind(mid+,r,rr);
}
while(sta.size()>now)
{
nnode nw=sta.top();
sta.pop();
fa[nw.x]=nw.f;dis[nw.x]=nw.d;
}
if(ok)
{
for(int i=l;i<=r;i++) ans[i]=;
}
} int main()
{
int n,m,T;
scanf("%d%d%d",&n,&m,&T);
S.clear();
for(int i=;i<=n;i++) fa[i]=i;
for(int i=;i<=n;i++) dis[i]=;
for(int i=;i<=m;i++)
{
node t;
scanf("%d%d%d%d",&t.x,&t.y,&t.s,&t.t);
t.s++;
if(t.s<=t.t) S.push_back(t);
}
for(int i=;i<=T;i++) ans[i]=;
ffind(,T,S);
for(int i=;i<=T;i++) if(ans[i]) printf("Yes\n");
else printf("No\n");
return ;
}

2017-02-16 22:07:48

最新文章

  1. sql server 中隐藏掉无关数据库
  2. [Tool] SourceTree操作中遇到错误(Filename too long)的解决方案
  3. SQL SERVER 查询表或字段在哪里使用过
  4. JQUERY相关
  5. Android两个独立的应用跳转实现方式小结
  6. ES6新特性(函数默认参数,箭头函数)
  7. Cocos2d-x利用CCHttpRequest获取网络图片并显示
  8. 升级iOS10之后调用摄像头/麦克风等硬件程序崩溃闪退的问题
  9. Vue2.0表单校验组件vee-validate的使用
  10. Android实例-MediaPlayer播放音乐和视频(XE8+小米2)
  11. uboot全局变量
  12. mvc PagerHelper静态分页
  13. java-随学随记之基础篇
  14. Android NDK开发(1)----- Java与C互相调用实例详解
  15. JavaFX基础学习之OkHttp/Gson
  16. Javascript—①你好,世界!
  17. javaScript获取url问号后面的参数
  18. CS:APP3e 深入理解计算机系统_3e ShellLab(tsh)实验
  19. 云计算之路-阿里云上:重启 manager 节点引发 docker swarm 集群宕机
  20. 2019年新软件发布分享HanGi.IT.AStrutTie.v2017 1CD

热门文章

  1. Bzoj1312 / POJ3155 Neerc2006 Hard Life
  2. cocos2dx中启用lua脚本
  3. Maven整体认识——详细介绍
  4. fs.createReadStream(filepath).pipe(response);这句是什么意思?
  5. python3中处理url异常
  6. pxc群集搭建
  7. Lambda 表达式 in java 8
  8. Pylot网站Web服务器性能和负载压力测试-适用Windows可绘制图表
  9. java的集合类面试题
  10. js判断文件格式及大小