[题目链接]

https://www.lydsy.com/JudgeOnline/problem.php?id=1143

[算法]

答案为最小路径可重复点覆盖所包含的路径数,将原图G进行弗洛伊德传递闭包,得到一张新图G',然后求出拆点二分图G2'的最大匹配,N - 最大匹配 即为答案,我们尝试证明上述结论 :

设祭祀点集合为S,最小路径可重复点覆盖的边集为Path,由于Path覆盖了所有节点,故每条路径上至多选一个点,有 : |S| <= |Path| , 因此,如果我们能构造出一组解,使得| S | = | Path | , 就证明了此结论,这里给出一种构造方案 :

首先求出拆点二分图的最大匹配,设节点x在拆点二分图上分别对应左部节点x和右部节点x' ,  对于每个非匹配节点x0,我们不断访问 x0,match[x0'],match[ match[x0'] ] .. 直到最后遇到一个左部节点y0,使得其右部点y0'为非匹配点, 那么就得到了一条路径, 其中y0为起点,x0为

终点,求出这样的所有路径,就得到了| Path |的一种方案,且所有路径不相交,我们现在要将| Path |集合中的每条路径选出一个节点,构成集合| S |

首先我们将所有路径的终点构成一个集合E,根据传递闭包的性质,两个祭祀点之间无路径相连,等价于在新图G’上任意两个祭祀点之间没有边,不妨让集合E中的每个节点走一条边,构成集合Next(E),如果E和Next(E)的交集为空集,则S = E

否则,对于交集中的每个点e,我们沿着e所在的路径不断向上移动,直到e不在当前的交集中,从E中删除e,加入e',重复以上过程,直到交集为空,就求出了S的一种组成方案

可以证明,在任何时刻,我们都能找到合法的e',因为若没有,说明e所在的路径上所有点都可以被其他路径上的点到达,我们可以找到到达e所在的的路径起点的那条路径,将其延伸,使得| Path | 减少1,并覆盖所有节点,与Path的最小性矛盾

综上所述,答案即为最小路径可重复点覆盖所包含的路径数

[代码]

#include<bits/stdc++.h>
using namespace std;
#define MAXN 210 int i,j,k,n,m,u,v,ans;
bool g[MAXN][MAXN],mp[MAXN][MAXN];
bool visited[MAXN];
int match[MAXN]; inline bool hungary(int u)
{
int v;
for (v = ; v <= n; v++)
{
if (mp[u][v] && !visited[v])
{
visited[v] = true;
if (!match[v] || hungary(match[v]))
{
match[v] = u;
return true;
}
}
}
return false;
} int main()
{ scanf("%d%d",&n,&m);
for (i = ; i <= n; i++) g[i][i] = true;
for (i = ; i <= m; i++)
{
scanf("%d%d",&u,&v);
g[u][v] = true;
}
for (k = ; k <= n; k++)
{
for (i = ; i <= n; i++)
{
for (j = ; j <= n; j++)
{
g[i][j] |= g[i][k] & g[k][j];
}
}
}
for (i = ; i <= n; i++)
{
for (j = ; j <= n; j++)
{
if (i != j && g[i][j])
mp[i][j] = true;
}
}
ans = n;
for (i = ; i <= n; i++)
{
memset(visited,false,sizeof(visited));
if (hungary(i)) ans--;
}
printf("%d\n",ans); return ; }

[CTSC 2008] 祭祀的更多相关文章

  1. 解题:CTSC 2008 祭祀

    题面 洛谷要求输出方案,懒得写了,但是还是放一下链接看看吧 (虽然现在二分图已经过气了=.=) 要求最长反链,最长反链=最小链覆盖,先Floyd传递闭包之后链覆盖就变成了边覆盖,然后最小边覆盖=总点数 ...

  2. 「CTSC 2008」祭祀

    题目链接 戳我 \(Solution\) 第一问 这道题要知道一个叫做\(Dilworth\)的定理 最长反链\(=\)最小链覆盖 证明(\(from\ r\_64\)): 所以我们只要求一个最小链覆 ...

  3. 【BZOJ 1146】【CTSC 2008】网络管理network

    一句话题意,树链上带改动区间第k大 感觉能够dfs+主席树O(nlog2n)过掉,但我不会写= = 于是写的线段树套平衡树+链剖+二分(改动O(nlog3n),查询O(nlog4n)慢了好多啊QAQ) ...

  4. CTSC&APIO2018游记

    Day-1 布吉岛干什么,好像只看了Splay Day0 再次布吉岛干什么,好像也只看了Splay 然后上了火车 wc没买方便面,只能吃40元的盒饭 半夜睡不着,那应该是我太菜了 Day1 九点下火车 ...

  5. 在离线环境中发布.NET Core至Windows Server 2008

    在离线环境中发布.NET Core至Windows Server 2008 0x00 写在开始 之前一篇博客中写了在离线环境中使用.NET Core,之后一边学习一边写了一些页面作为测试,现在打算发布 ...

  6. Windows Server 2008 R2常规安全设置及基本安全策略

    这篇文章主要介绍了Windows Web Server 2008 R2服务器简单安全设置,需要的朋友可以参考下 用的腾讯云最早选购的时候悲催的只有Windows Server 2008 R2的系统,原 ...

  7. Windows Server 2008 小操作汇总

    用惯了Windows2003,去配置2008的时候还真有点摸不着头脑.干脆把有用到的都列在这里,方便后续查找. 一.安装IIS.Telnet      点击:开始 -> 管理工具 -> 服 ...

  8. Windows 2008 R2 安装sp1时未知错误的解决办法

    最近在为Windows Server 2008 R2 打sp1补丁时出现“发生未知错误”,详细信息错误:0x800f0818: google后找到解决问题步骤,参照:http://www.wikiho ...

  9. 如何在Windows Server 2008 R2没有磁盘清理工具的情况下使用系统提供的磁盘清理工具

    今天,刚好碰到服务器C盘空间满的情况,首先处理了临时文件和有关的日志文件后空间还是不够用,我知道清理C盘的方法有很多,但今天只分享一下如何在Windows Server 2008 R2没有磁盘清理工具 ...

随机推荐

  1. linux 卸载 mongo2.6

    要求:linux 卸载 mongo2.6 版本:linux系统:Ubuntu 16.04 mongo:  mongo 2.6.12 1.  查看安装的mongo版本和服务 # dpkg –l | gr ...

  2. CSS——半透明

    1.opacity:不仅背景半透明,内部其他元素也半透明 2.rgba():只有背景半透明. <!DOCTYPE html> <html lang="en"> ...

  3. java设计模式02观察者模式

    观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 这里主要讲一下学习内置观察者的记录,在JA ...

  4. nagios 安装pnp4nagios插件

    Naigos install pnp4nagios 绘图插件 原文地址:http://www.cnblogs.com/caoguo/p/5022230.html [root@Cagios ~]# yu ...

  5. HDU_1063_Exponentiation_大数

    Exponentiation Time Limit: 2000/500 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  6. 用jquery-easyui的布局layout写后台管理页面

    先在官网下载easyui文档 引入头部文件 <link rel="stylesheet" type="text/css" href="${pag ...

  7. pandas.DataFrame.quantile

    pandas.DataFrame.quantile 用于返回数据中的 处于1/5    1/2(中位数)等数据

  8. Django - app

    1.app目录 migrations:数据库操作的记录(只记录修改表结构的记录); __init__文件:python2中必须填加,python3中无要求,可以不添加: admin:django为我们 ...

  9. uva 524(Prime Ring Problem UVA - 524 )

    dfs练习题,我素数打表的时候j=i了,一直没发现实际上是j=i*i,以后可记住了.还有最后一行不能有空格...昏迷了半天 我的代码(紫书上的算法) #include <bits/stdc++. ...

  10. Unity jointmoto

    jointmoto是模拟电机的,他的参数包括了最高车速和最大扭矩 扭矩总是正数,而目标车速决定了方向