题目大意

一副图告诉你那些点之间没有连边,并保证整幅图可以被划分为至多两个团。
请你找出每一对没有连边的点,使得它们连边后,图中最大团的大小会变大。

模型转化

因为原图要被分成至多两个团,其补图一定是二分图。
最大团大小等同于最大独立集大小,因此和最大匹配挂钩。
求哪些边一定在最大匹配上。

做法

先做最大匹配算法。
一定在最大匹配上的边一定是匹配边(显然)。
然后考虑三种情况会使得匹配边u->v不一定在最大匹配中。
1、在残余网络中,u可以到达T。
如果退流u->v,那么S就可以走u,又因为u能到达T,最大匹配不会变,则u->v不一定在最大匹配中。
2、在残余网络中,S可以到达v。
同理。
这两种情况随便搜一遍就可以判。
3、在残余网络中,u可以到达v。
如果退流u->v,那么S走到u,u走到v,v再到T,最大匹配不会变。
则u->v不一定在最大匹配中。
这种情况注意u->v是匹配边,所以v连了有向边到u,因此u和v处在一个环中。可以做一遍Tarjan,就能判掉。

#include<cstdio>
#include<algorithm>
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
const int maxn=10000+10,maxm=150000+10;
struct dong{int x,y;
} ans[maxm];
int h2[maxn],g2[maxm*2],n2[maxm*2];
int h[maxn],go[maxm*2],next[maxm*2];
int h3[maxn],g3[maxm*2],n3[maxm*2];
int co[maxn],re[maxn],A[maxn],B[maxn],belong[maxn],dfn[maxn],low[maxn],sta[maxn];
int pd[maxn];
bool bz[maxn];
int i,j,k,l,r,s,t,n,m,tot,top,cnt,cnt1,cnt2;
int read(){int x=0,f=1;char ch=getchar();while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
void add(int x,int y){go[++tot]=y;next[tot]=h[x];h[x]=tot;
}
void add2(int x,int y){g2[++cnt]=y;n2[cnt]=h2[x];h2[x]=cnt;
}
void add3(int x,int y){g3[++cnt]=y;n3[cnt]=h3[x];h3[x]=cnt;
}
void dfs(int x,int y){co[x]=y;if (y) B[++cnt2]=x;else A[++cnt1]=x;int t=h2[x];bz[x]=1;while (t){if (!bz[g2[t]]) dfs(g2[t],1-y);t=n2[t];}
}
int hungary(int x){int t=h[x];while (t){if (pd[go[t]]<j){pd[go[t]]=j;if (re[go[t]]==0||hungary(re[go[t]])){re[go[t]]=x;return 1;}}t=next[t];}return 0;
}
void dg(int x){co[x]=1;bz[x]=1;int t=h[x];while (t){if (!bz[go[t]]&&re[go[t]]!=x){bz[go[t]]=1;co[go[t]]=1;if (re[go[t]]&&!bz[re[go[t]]]) dg(re[go[t]]);}t=next[t];}
}
void travel(int x,int y){co[x]=2;bz[x]=1;if (y==1){int t=h[x];while (t){if (re[x]!=go[t]&&!bz[go[t]]) travel(go[t],0);t=next[t];}}else{int t=h[x];while (t){if (re[go[t]]==x&&!bz[go[t]]) travel(go[t],1);t=next[t];}}
}
bool cmp(dong a,dong b){return a.x<b.x||a.x==b.x&&a.y<b.y;
}
void tarjan(int x){bz[x]=1;sta[++top]=x;pd[x]=1;dfn[x]=low[x]=++cnt;int t=h3[x];while (t){if (!bz[g3[t]]){tarjan(g3[t]);low[x]=min(low[x],low[g3[t]]);}else if (pd[g3[t]]) low[x]=min(low[x],dfn[g3[t]]);t=n3[t];}if (dfn[x]==low[x]){++tot;do{belong[sta[top]]=tot;pd[sta[top]]=0;top--;}while (sta[top+1]!=x);}
}
int main(){freopen("a.in","r",stdin);freopen("a.out","w",stdout);n=read();m=read();fo(i,1,m){j=read();k=read();add2(j,k);add2(k,j);}fo(i,1,n) if (!bz[i]) dfs(i,0);fo(i,1,m){j=g2[i*2-1];k=g2[i*2];if (co[j]) swap(j,k);add(j,k);add(k,j);}fo(i,1,cnt1){j++;hungary(A[i]);}fo(i,1,n) co[i]=bz[i]=pd[i]=0;fo(i,1,cnt2){k=B[i];if (re[k]) pd[re[k]]=1;}fo(i,1,cnt1){k=A[i];if (!bz[k]&&!pd[k]) dg(k);}fo(i,1,n) bz[i]=0;fo(i,1,cnt2){k=B[i];if (!bz[k]&&re[k]==0) travel(k,1);}cnt=0;fo(i,1,cnt1){k=A[i];t=h[k];while (t){if (re[go[t]]==k) add3(go[t],k);else add3(k,go[t]);t=next[t];}}cnt=top=tot=0;fo(i,1,n) bz[i]=pd[i]=0;fo(i,1,n)if (!bz[i]) tarjan(i);top=0;fo(i,1,m){j=go[i*2];k=go[i*2-1];if (re[k]==j&&co[j]!=2&&co[k]!=1&&belong[j]!=belong[k]){if (j>k) swap(j,k);ans[++top].x=j;ans[top].y=k;}}sort(ans+1,ans+top+1,cmp);printf("%d\n",top);fo(i,1,top) printf("%d %d\n",ans[i].x,ans[i].y);
}

[HAOI2017]新型城市化相关推荐

  1. Luogu P3731 [HAOI2017]新型城市化

    题目显然可以转化为求每一条边对二分图最大独立集的贡献,二分图最大独立集\(=\)点数\(-\)最大匹配数,我们就有了\(50pts\)做法. 正解的做法是在原图上跑\(Tarjan\),最开始我想复杂 ...

  2. 精准扶贫电商重整流通-农业大健康·李玉庭: 谋定功能农产品

    精准扶贫电商重整流通-农业大健康·李玉庭: 谋定功能农产品 中国食品报 中国经济和信息化网 新闻中国采编网 中国新闻采编网 谋定研究中国智库网 经信研究 国研智库 国情讲坛 哲商对话 万赢信采编: & ...

  3. 农村电商谋定双创工程-李玉庭:互联网+农产品重整流通

    农村电商谋定双创工程-李玉庭:互联网+农产品重整流通 中国食品报 中国经济和信息化网 新闻中国采编网 中国新闻采编网 谋定研究中国智库网 经信研究 国研智库 国情讲坛 万赢信采编:"在今年全 ...

  4. 地摊经济和夜经济-国情讲坛·周荣江:城市生态谋定治理转型

    地摊经济和夜经济-国情讲坛·周荣江:城市生态谋定治理转型 新闻中国采编网 中国新闻采编网 谋定研究中国智库网 经信研究 国研智库 国情讲坛 哲商对话 万赢信采编:"夜经济既丰富了国民生活,对 ...

  5. 同济大学核心学术刊物基本目录_党建丨清华大学建筑学院、同济大学建筑与城市规划学院研究生党支部联合举办“城乡二元关系与生态文明建设内涵”主题党日活动...

    01  开场 2020年11月7日,由清华大学建筑学院党建中心.中共同济大学建筑与城市规划学院研究生总支委员会联合主办,清华大学建筑学院建研183党支部.同济大学建筑与城市规划学院研究生第五.七.十六 ...

  6. 中国园区经济行业“十四五“规划与前景深度研究报告2021年版

    [撰写单位]:鸿晟信合研究院 第一部分 产业环境透视 第一章 园区经济发展综述 第一节 园区经济定义及类型 一.园区经济定义 二.园区经济类型 三.建设现代园区经济的方法 第二节 园区经济的组成要素 ...

  7. 智慧城市指挥调度系统软件解决方案

    智慧城市指挥调度系统软件解决方案 智慧城市一站式指挥调度中心利用信息整合技术,推动资源互联互通,实行部门集中办公,消除信息孤岛,实现资源共享,节约建设投资,是政府实施统一宣传.统一服务.创新服务,进行 ...

  8. 霍尼韦尔和西安开米深入合作;中国采购行业出现W形复苏迹象 | 美通企业日报...

    今日看点 霍尼韦尔和西安开米深入合作,打造更健康安全的高端智能楼宇.西安开米开发的万瑞府高端公寓坐落西安高新区核心地段,并配套世界经典酒店.国际总部办公中心.艺术商业中心,集建筑.设计与生活为一体,将 ...

  9. 【特色小镇】智慧小镇:小镇建设总体规划方案

    有些地方将智慧小镇建设当做智慧城市的新包装,一些地方被企业营销牵着鼻子走,国内智慧小镇虚火过旺和盲目贴标签的行为也广为诟病.国家智慧小镇工作将在探索和指标体系的实施过程中,对国内智慧小镇建设存在的诸多 ...

最新文章

  1. 我对Java Serializable(序列化)的理解和总结
  2. 高效Java编程工具集锦
  3. 基于注解的字段脱敏处理
  4. MS SQL开发命名规则
  5. html调用阅读模式,easyread.js—给网站开启阅读模式html教程
  6. css的几种垂直水平居中方法
  7. 年轻人不讲武德不仅白piao接口测试知识还白piao接口测试工具会员
  8. linux能装ps,在linux上使用ps(转载)
  9. 专升本计算机专业是理工类吗,理工类专接本有些专业
  10. java 映射servlet,java – 将映射或对象从jsp传递到servlet
  11. oracle 导入时出现两个,Oracle的导入及两个错误
  12. android 广播 源码,广播电台APP源代码 电台APP源代码 播客APP源代码 Android源代码...
  13. mysqlserver 下载安装
  14. 拼多多网站的服务器多大,拼多多打不开网页怎么回事
  15. 怎样恢复手机oracle默认窗口,通达信恢复默认版面,Effects界面如何恢复初始默认设置...
  16. MPEG-2 TS学习(一)MPEG-2 TS格式解析
  17. 达人评测 骁龙778g和骁龙780g的区别 选哪个好
  18. 一台计算机有多少公顷,亩换算成公顷(公顷换算成亩的计算器)
  19. 把数字翻译成字符串python_把数字翻译成字符串
  20. 1.2文字排版、颜色、表格、图像形状、Jumbotron、信息提示框、按钮、按钮组、徽章、加载效果、分页、列表组、卡片、下拉菜单、折叠

热门文章

  1. IDEA 启动报错:java.lang.IllegalStateException: failed to create a child event loop 问题解决
  2. 还在羡慕华为手机能当门禁卡?其实iPhone也可以,一招教你学会
  3. 计算机ppt密码是什么,ppt密码如何设置,这个保护你文件的计算机技能很实用
  4. 合天网络靶场能力详解
  5. pcb二次钻孔_PCB板钻孔工艺缺陷及排除方法
  6. ubuntu查看 固态硬盘位置_Ubuntu 固态硬盘 4K对齐及启用 Trim,及其验证方法
  7. 四川大学计算机应用基础考试试题,几个有关计算机基础的题目!!!~~
  8. 成都大学生接连遭遇购物网“被注册” 疑信息泄露
  9. 西安IATF16949认证_西安IATF16949咨询_8.3.3.2制造过程设计输入
  10. 传统行业是否使用微服务的讨论——不够痛就别微服务