分治+并查集。假设要求[L,mid]的答案,那么很明显,如果一条边的两个端点都>mid的话或者一个端点>mid一个端点<L,说明询问[L,mid]这个区间中任何一点时候,这一条边都是连接的,否则的话递归下去处理。[mid+1,R]同理。

一个图不是二分图的话说明存在奇环,奇环可以用并查集处理。这里的并查集不使用路径压缩而使用按轶合并。并查集的还原操作可以用一个栈记录每次合并时的具体操作,然后按序还原即可。

  代码

  1 #include<cstdio>
  2 #include<vector>
  3 #define N 300010
  4 using namespace std;
  5 int f[N],d[N];
  6 int n,m,i,dp;
  7 int tt[N],pre[N],p[N],ans[N],flag[N];
  8 int tot,stack[N],a[N],b[N],g[N];
  9 vector<int> vec[N];
 10 void link(int x,int y)
 11 {
 12     dp++;pre[dp]=p[x];p[x]=dp;tt[dp]=y;
 13 }
 14 int getfa(int x,int& y)
 15 {
 16     y=0;
 17     while (x!=f[x])
 18     {
 19         y^=g[x];
 20         x=f[x];
 21     }
 22     return x;
 23 }
 24 void Union(int x,int y,int &z)
 25 {
 26     int disx,disy;
 27     x=getfa(x,disx);
 28     y=getfa(y,disy);
 29     if (x!=y)
 30     {
 31     if (d[x]>d[y]) x^=y^=x^=y;
 32     f[x]=y;
 33     g[x]=(disx^disy^1);
 34     tot++;stack[tot]=x;
 35     if (d[x]==d[y])
 36     {
 37         flag[tot]=1;
 38         d[y]++;
 39     }
 40     else
 41         flag[tot]=0;
 42     }
 43     else
 44     {
 45         if (disx^disy^1)
 46             z|=1;
 47     }
 48 }
 49 void recover(int x)
 50 {
 51     while (tot>x)
 52     {
 53         if (flag[tot])
 54             d[f[stack[tot]]]--;
 55         f[stack[tot]]=stack[tot];
 56         g[stack[tot]]=0;
 57         tot--;
 58     }
 59 }
 60 void solve(int x,int l,int r,int q)
 61 {
 62     int i,tmp,len,t,Ans;
 63     if (l==r)
 64     {
 65         ans[l]=1-q;
 66         return;
 67     }
 68     int mid=(l+r)>>1;
 69
 70     vec[2*x].clear();
 71     vec[2*x+1].clear();
 72     tmp=tot;
 73     Ans=q;
 74     len=vec[x].size();
 75     for (i=0;i<len;i++)
 76     {
 77         t=vec[x][i];
 78         if ((a[t]>mid)||((a[t]<l)&&(b[t]>mid)))
 79             Union(a[t],b[t],Ans);
 80         else
 81             vec[2*x].push_back(t);
 82     }
 83     solve(2*x,l,mid,Ans);
 84
 85     Ans=q;
 86     recover(tmp);
 87     for (i=0;i<len;i++)
 88     {
 89         t=vec[x][i];
 90         if ((b[t]<mid+1)||((a[t]<mid+1)&&(b[t]>r)))
 91             Union(a[t],b[t],Ans);
 92         else
 93             vec[2*x+1].push_back(t);
 94     }
 95     solve(2*x+1,mid+1,r,Ans);
 96 }
 97 int main()
 98 {
 99     int tt;
100     scanf("%d",&tt);
101     while (tt)
102     {
103     tt--;
104     scanf("%d%d",&n,&m);
105     for (i=1;i<=n;i++)
106     {
107         g[i]=0;
108         f[i]=i;
109     }
110     tot=0;
111     vec[1].clear();
112     for (i=1;i<=m;i++)
113     {
114         scanf("%d%d",&a[i],&b[i]);
115         if (a[i]>b[i])
116             a[i]^=b[i]^=a[i]^=b[i];
117         vec[1].push_back(i);
118     }
119     solve(1,1,n,0);
120     for (i=1;i<=n;i++)
121         printf("%d",ans[i]);
122     printf("\n");
123     }
124 }

转载于:https://www.cnblogs.com/fzmh/p/4719609.html

hdu5354 Bipartite Graph相关推荐

  1. B - A Funny Bipartite Graph

    B - A Funny Bipartite Graph 题意: 一个二分图,左右各有n个点,左边第i个点有一个属性mi,它在一个图中的价值为midi,其中di为它在图中的度数(特殊的,如果度数为0,则 ...

  2. Fast spectral clustering learning with hierarchical bipartite graph for large-scale data

    Fast spectral clustering learning with hierarchical bipartite graph for large-scale data 基于层次二分图的大规模 ...

  3. 二分匹配大总结——Bipartite Graph Matchings[LnJJF]

    文章目录 二分匹配--Bipartite Graph Matchings[LnJJF] 认识:什么是二分图? 理解:现实模型如何与二分图相互转化? 如何判断能否转化? 能够转化的话,如何转化? 应用: ...

  4. Bipartite graph/network学习

    Bipartite graph/network翻译过来就是:二分图. 维基百科中对二分图的介绍为:二分图是一类图(G,E),其中G是顶点的集合,E为边的集合,并且G可以分成两个不相交的集合U和V,E中 ...

  5. Bipartite Graph Based Multi-View Clustering

    Bipartite Graph Based Multi-View Clustering 基于二部图的多视图聚类 abstract 对于基于图的多视图聚类,一个关键问题是通过两阶段学习方案捕获共识聚类结 ...

  6. C#,图论与图算法,二分图(Bipartite Graph)的霍普克罗夫特-卡普(Hopcroft Karp)最大匹配算法与源程序

    二分图Bipartite graph 有没有可能通过数学过程找到你的灵魂伴侣?大概让我们一起探索吧! 假设有两组人注册了约会服务.在他们注册后,会向他们展示另一组人的图像并给出他们的描述.他们被要求选 ...

  7. Bipartite Graph多视图学习聚类文章总结

    看了一些anchor graph和bipartite graph 的文章始终不知道他们的区别在哪里.今天总结一下这类文章. 1.能看到最早的这类关于多视图学习的文章 Large-Scale Multi ...

  8. 论文阅读 [TPAMI-2022] Multiview Clustering: A Scalable and Parameter-Free Bipartite Graph Fusion Method

    论文阅读 [TPAMI-2022] Multiview Clustering: A Scalable and Parameter-Free Bipartite Graph Fusion Method ...

  9. CF600F:Edge coloring of bipartite graph(二分图、构造)

    解析 首先大胆猜结论:答案就是最大的点度数 考虑如何构造 设一个点联通的边的颜色集合为S,由题意得S中的元素不可重 假设新加入一条边(u,v) 设c1=mex(Su),c2=mex(Sv)c1=mex ...

最新文章

  1. 潘建伟团队最新研究成果登上Nature:首次实现1120公里长距离无中继纠缠量子密钥分发...
  2. php的session实现
  3. flutter实现(OutlineButton)线框按钮
  4. 内网渗透-域内有网和无网
  5. SQLite在指定列后面插入字段_个人学习系列 - 防止MySQL重复插入数据
  6. 如何评价分类模型性能?(足球荔枝)
  7. Linux下Makefile的automake生成全攻略
  8. 前端学习(3088):vue+element今日头条管理-关于接口的使用(有声版)
  9. python matplotlib 散点图_python matplotlib散点图颜色
  10. Oracle/PLSQL AFTER DELETE Trigger
  11. kali 2019-4中文乱码解决方法
  12. meta http-equiv(属性详解)
  13. ubuntu samba配置
  14. QT 静态链接库和动态链接库
  15. PyQt5教程(二)——PyQt5的安装(详细)
  16. OpenLayers叠加天地图矢量、影像、注记
  17. vsode 编译报错:main.c:4:10: fatal error: iostream: 没有那个文件或目录
  18. forward和include的区别详解
  19. 六年如逆旅,我亦是行人:一个顾问的六年安全从业经历
  20. Xception实现动物识别(TensorFlow)

热门文章

  1. Socket编程Http下载的简单实现
  2. 保险公司信息系统审计刍议
  3. 关于SVN版本控制工具的冲突解决方案
  4. Sqlite优化记录:使用全文索引加快检索速度-转
  5. Linux段错误-转
  6. 1075. 链表元素分类(25)-PAT乙级真题
  7. PAT 乙级 1003. 我要通过!(20) Java版
  8. L2-014. 列车调度-PAT团体程序设计天梯赛GPLT
  9. Spring+MyBatis多数据源配置实现
  10. 五种 JSP页面跳转方法详解