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]祭祀的更多相关文章

  1. BZOJ 1143 1143: [CTSC2008]祭祀river 最长反链

    1143: [CTSC2008]祭祀river Description 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都会在水面上举办盛大的祭祀活动. ...

  2. BZOJ 1143: [CTSC2008]祭祀river 最长反链

    1143: [CTSC2008]祭祀river Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline ...

  3. 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 ...

  4. bzoj 1143: [CTSC2008]祭祀river / 2718: [Violet 4]毕业旅行 -- 二分图匹配

    1143: [CTSC2008]祭祀river Time Limit: 10 Sec  Memory Limit: 162 MB Description 在遥远的东方,有一个神秘的民族,自称Y族.他们 ...

  5. 1143: [CTSC2008]祭祀river(最长反链)

    1143: [CTSC2008]祭祀river 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1143 Description: 在遥远的 ...

  6. BZOJ1143 [CTSC2008]祭祀river 【二分图匹配】

    1143: [CTSC2008]祭祀river Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 3236  Solved: 1651 [Submit] ...

  7. bzoj1143(2718)[CTSC2008]祭祀river(最长反链)

    1143: [CTSC2008]祭祀river Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2781  Solved: 1420[Submit][S ...

  8. 洛谷 P4298: bzoj 1143: [CTSC2008]祭祀

    题目传送门:洛谷 P4298. 题意简述: 给定一个 \(n\) 个点,\(m\) 条边的简单有向无环图(DAG),求出它的最长反链,并构造方案. 最长反链:一张有向无环图的最长反链为一个集合 \(S ...

  9. [BZOJ 1143] [CTSC2008] 祭祀river 【最长反链】

    题目链接:BZOJ - 1143 题目分析 这道题在BZOJ上只要求输出可选的最多的祭祀地点个数,是一道求最长反链长度的裸题. 下面给出一些相关知识: 在有向无环图中,有如下的一些定义和性质: 链:一 ...

随机推荐

  1. OpenCV3.1使用SIFT

    待完善... Opencv3.1.0+opencv_contrib配置及使用SIFT测试

  2. 利用js实现table增加一行

    简单的方法: 用jquery插件,比如设置该table的id为mytable <table id="mytable"> <tr> <td> 第一 ...

  3. PGM图片格式与代码

    这两天在搞神经网络,里面的一个人脸数据库的图片格式是PGM,事实上之前早就知道了这个图片格式,可是没去深究这个图片格式的数据究竟是什么安排的.搜索了下百度百科,发现介绍的真是简单,以下就自己来系统地整 ...

  4. JAVA Eclipse开发Android如何让屏幕保持为竖直或水平状态

    在Manifest.xml文件中找到activity部分,添加下面这一行 android:screenOrientation="landscape" landscape是横向,po ...

  5. HDU 4927 大数

    题意非常easy: 对于长度为n的数.做n-1遍.生成的新数列: b1=a2-a1   b2=a3-a2  b3=a4-a3 c1=b2-b1   c2=b3-b2 ans=c2-c1 最后推出公式: ...

  6. Android Canvas之Path操作

    接上篇,Android自己定义View工具:Paint&Canvas(二) 上一篇中介绍的Canvas绘制图形仅仅能画一些常规图形(圆.椭圆.矩形等),假设想绘制更复杂的图形.Path神器来了 ...

  7. 编程算法 - 两个链表的第一个公共结点 代码(C)

    两个链表的第一个公共结点 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入两个链表, 找出它们的第一个公共结点. 计算链表的长度, 然后移动 ...

  8. caffe-ubuntu1604-gtx850m-i7-4710hq----VGG_ILSVRC_16_layers.caffemodel

    c++调用vgg16: ./build/install/bin/classification \ /media/whale/wsWin10/wsCaffe/model-zoo/VGG16//deplo ...

  9. Urho3D 在Win10下编辑器崩溃的解决方案

    本解决方案来自于 https://github.com/urho3d/Urho3D/issues/2417 描述 在Win10中通过CMake启用URHO_ANGELSCRIPT选项的前提下生成Urh ...

  10. Anaconda2

    Anaconda 是一个打包的python,一次把好多需要的包都安装好了.对于Python2.7把PyQt5都弄好了,不需要自己来编译! 看看这个 http://conda.pydata.org/do ...