P4298 [CTSC2008]祭祀
传递闭包跑一遍按联通建图
$(1)$最长反链长度=最小链覆盖=n-最大匹配
$(2)$定义作为最大匹配出现在左端点的集合为$S$,作为最大匹配出现在右端点的集合为$T$
定义函数$ft(x)$为$S$中任意点在$T$中的对应点,定义函数$fs(s)$为$T$中任意点在$S$中的对应点
先找最大匹配,从$S$的补集出发增广,当然这里增广不是真正意义上的增广,只是遍历并标记经过的点而已
左边没有标记过的或右边标记过的就是最小点覆盖,也就是最大独立集的补集
$(3)$枚举点,每次删掉在跑匹配就行
My complete code:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
struct node{
int to,next;
}edge[11000];
int n,m,ans,link,num,cnt,idx,ci; int dis[210][210],head[210],mat[210],to[210],s[210],t[210],visit[210];
bool del[210];
inline void add(int u,int v){
edge[++cnt]=(node){v,head[u]}; head[u]=cnt;
}
bool dfs(int u){
if(del[u])
return false;
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].to;
if(visit[v]!=idx&&!del[v]){
visit[v]=idx;
if(!mat[v]){
to[u]=v;
mat[v]=u;
return true;
}else if(dfs(mat[v])){
to[u]=v;
mat[v]=u;
return true;
}
}
}
return false;
}
void cal(int u){
if(s[u])
return;
s[u]=1;
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].to;
if(t[v])
continue;
t[v]=1;
cal(mat[v]);
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i){
int u,v;
scanf("%d%d",&u,&v);
dis[u][v]=1;
}
for(int k=1;k<=n;++k)
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
dis[i][j]|=(dis[i][k]&dis[k][j]);
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if(dis[i][j])
add(i,j);
ans=n;
idx=0;
memset(del,false,sizeof(del));
for(int i=1;i<=n;++i){
++idx;
if(dfs(i))
ans--;
}
printf("%d\n",ans);
for(int i=1;i<=n;++i)
if(!to[i])
cal(i);
for(int i=1;i<=n;++i)
printf("%d",!t[i]&&s[i]);puts("");
for(int i=1;i<=n;++i){
memset(del,false,sizeof(del));
memset(mat,0,sizeof(mat));
memset(visit,0,sizeof(visit));
int nn=0;
for(int j=1;j<=n;++j)
if(dis[i][j] || j==i || dis[j][i])
del[j]=true;
else
nn++;
idx=0;
for(int j=1;j<=n;++j)
if(!del[j]){
++idx;
if(dfs(j))
nn--;
}
if(nn==ans-1)
printf("1");
else
printf("0");
}
return 0;
}
P4298 [CTSC2008]祭祀的更多相关文章
- BZOJ 1143 1143: [CTSC2008]祭祀river 最长反链
		
1143: [CTSC2008]祭祀river Description 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都会在水面上举办盛大的祭祀活动. ...
 - BZOJ 1143: [CTSC2008]祭祀river 最长反链
		
1143: [CTSC2008]祭祀river Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline ...
 - Bzoj 2718: [Violet 4]毕业旅行 && Bzoj 1143: [CTSC2008]祭祀river  传递闭包,二分图匹配,匈牙利,bitset
		
1143: [CTSC2008]祭祀river Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1878 Solved: 937[Submit][St ...
 - bzoj 1143: [CTSC2008]祭祀river / 2718: [Violet 4]毕业旅行  -- 二分图匹配
		
1143: [CTSC2008]祭祀river Time Limit: 10 Sec Memory Limit: 162 MB Description 在遥远的东方,有一个神秘的民族,自称Y族.他们 ...
 - 1143: [CTSC2008]祭祀river(最长反链)
		
1143: [CTSC2008]祭祀river 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1143 Description: 在遥远的 ...
 - BZOJ1143  [CTSC2008]祭祀river  【二分图匹配】
		
1143: [CTSC2008]祭祀river Time Limit: 10 Sec Memory Limit: 162 MB Submit: 3236 Solved: 1651 [Submit] ...
 - bzoj1143(2718)[CTSC2008]祭祀river(最长反链)
		
1143: [CTSC2008]祭祀river Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2781 Solved: 1420[Submit][S ...
 - 洛谷 P4298: bzoj 1143: [CTSC2008]祭祀
		
题目传送门:洛谷 P4298. 题意简述: 给定一个 \(n\) 个点,\(m\) 条边的简单有向无环图(DAG),求出它的最长反链,并构造方案. 最长反链:一张有向无环图的最长反链为一个集合 \(S ...
 - [BZOJ 1143] [CTSC2008] 祭祀river 【最长反链】
		
题目链接:BZOJ - 1143 题目分析 这道题在BZOJ上只要求输出可选的最多的祭祀地点个数,是一道求最长反链长度的裸题. 下面给出一些相关知识: 在有向无环图中,有如下的一些定义和性质: 链:一 ...
 
随机推荐
- mac安装apache的mod_wsgi模块
			
第一次用pip安装 ,最终不能使用,原因是系统自带的apache,python和新安装的冲突, 所以需要安装时需要指定apache,python路径 所以用make makeinstall方式 参考链 ...
 - EasyMvc入门教程-高级控件说明(19)表单控件
			
我们开发的系统,主要的一个功能就是采集界面数据,传回到服务器,比如:录入学生信息,这时候就需要表单. EasyMvc提供了如下界面控件,如下图所示:(控件+布局) EasyMvc实现了基于模型的绑定, ...
 - AngularJS的过滤器示例
			
代码下载:https://files.cnblogs.com/files/xiandedanteng/angularJSFilter.rar 显示效果: 页面代码: <!DOCTYPE HTML ...
 - JAVA_Error initializing endpoint怎么办
			
1 运行CMD,输入命令netstat –ano,找到这个TCP,后缀为8080的PID(我的是2660),然后打开任务管理器,在进程选项卡中打开PID查看 2 在右侧的进程窗口找到PID是左侧的 ...
 - 【APT】NodeJS 应用仓库钓鱼,大规模入侵开发人员电脑,批量渗透各大公司内网
			
APT][社工]NodeJS 应用仓库钓鱼,大规模入侵开发人员电脑,批量渗透各大公司内网 前言 城堡总是从内部攻破的.再强大的系统,也得通过人来控制.如果将入侵直接从人这个环节发起,那么再坚固的防线, ...
 - Bootstrap 模态框、轮播 结合使用
			
Bootstrap 模态框和轮播分开使用的教程网上非常多.可是两者结合使用的样例和资料非常少. 两者结合使用时,開始我遇到了不少bug,如今分享给大家. 我的这个样例是把图片轮播嵌入到模态框里. 最后 ...
 - apue学习笔记(第十四章 高级I/O)
			
本章涵盖了从多概念和函数:非阻塞I/O.记录锁.I/O多路转换.异步I/O.readv和writev函数以及存储映射I/O 非阻塞I/O 非阻塞I/O使我们可以发出open.read和write这样的 ...
 - 重读金典------高质量C编程指南(林锐)-------第二章 程序的板式
			
2.1 空行 规则1:在每个类声明之后,每个函数定义结束之后加空行. 规则2:在某个函数体内,相关的不加空行,不相关的加空行. // 空行 void Function1(-) { - } // 空行 ...
 - Excel工作表忘记密码如何破解?
			
第一种方法就是按住快捷键ALT+F11,然后切换出VBA编辑窗口,如图一:在该窗口的左侧我们的选择那个忘记密码的工作表,比如sheet 1... 2 然后我们复制以下代码 “Sub Pojie()Ac ...
 - anaconda3.5  3.6   2.7
			
https://repo.continuum.io/archive/ Filename Size Last Modified MD5 Anaconda2-5.0.1-Linux-x86.sh 413. ...