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上只要求输出可选的最多的祭祀地点个数,是一道求最长反链长度的裸题. 下面给出一些相关知识: 在有向无环图中,有如下的一些定义和性质: 链:一 ...
随机推荐
- 转: Syslog协议介绍
转: http://liu-hliang.iteye.com/blog/827392 在网上搜的文章,写的很全乎.摘抄如下,供大家参考学习 1.介绍 在Unix类操作系统上,syslog广泛应用于系统 ...
- node.js之http-server
我们有时候会遇到这种情况,一个html文件在本地打开时,测试平常的功能还行,但是,一涉及到ajax请求,就算你是请求本地的json文件,他都会涉及到跨域的问题,浏览器本身就限制了本地打开时,不允许跨域 ...
- Android Studio/IntelliJ IDEA使用手记
使用第三方jar包 1.将jar包放入项目里的libs文件夹中: 2.在project选中该jar包,点击右键选择:"Add as library": 1. 代码中中文显示乱码 ...
- lambda表达式转换sql
using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; usin ...
- 两个栈来实现一个队列的C++代码
利用两个栈来实现一个队列, 这个问题非经常见. 最关键的是要有好的思路, 至于实现, 那是非常easy的事情了. 在本文中, 也想说说自己的思路, 可是. 我认为用代码来表述思路更符合我的习惯. 也 ...
- void 0 或者 undefined
Problem 在检查一个值是否为undefined的时候.你们是假设去測试的? 要是之前的我会这样子測试 function isUndefined(obj){ return obj === unde ...
- dede列表页调用文章,其实是所有页面都可以调用,第一次应用sql标签
{dede:sql sql="SELECT aid,typeid,body,userip FROM `#@__addonarticle` where aid='6' or aid='7' o ...
- 【转】2018年EI收录中文期刊目录
序号 中文刊名 收录情况 1 声学学报 保持收录 2 航空学报 保持收录 3 兵工学报 保持收录 4 自动化学报 保持收录 5 电子学报 保持收录 6 太阳能学报 保持收录 7 测绘学报 保持收录 8 ...
- erlang的timer定时器浅析
timer作为其计时器: erlang的计时器timer是通过一个唯一的timer进程实现的,该进程是一个gen_server,用户通过timer:send_after和timer:apply_aft ...
- 查询SQL2008字段和注释
SELECT 表名 then d.name else '' end, 表说明 then isnull(f.value,'') else '' end, 字段序号 = a.colorder, 字段名 = ...