[1143] [CTSC2008]祭祀river(最大独立集 || 偏序集最大反链)
2024-08-24 11:44:29
网上说这是偏序集最大反链,然而我实在不理解。
所以我换了一个思路,先用floyd,根据点的连通性连边,
问题就转换成了找出最多的点,使任意两个点之间不连边,也就是最大独立集。
——代码
#include <cstdio>
#include <cstring>
#include <iostream> const int MAXN = ;
int n, m, ans, cnt;
int a[MAXN][MAXN], belong[MAXN], head[MAXN], to[MAXN << ], next[MAXN << ];
bool vis[MAXN]; inline int read()
{
int x = ;
char c = getchar();
for(; !isdigit(c); c = getchar());
for(; isdigit(c); c = getchar()) x = (x << ) + (x << ) + c - '';
return x;
} inline bool find(int u)
{
int i, v;
for(i = head[u]; i ^ -; i = next[i])
{
v = to[i];
if(!vis[v])
{
vis[v] = ;
if(!belong[v] || find(belong[v]))
{
belong[v] = u;
return ;
}
}
}
return ;
} inline void add(int x, int y)
{
to[cnt] = y;
next[cnt] = head[x];
head[x] = cnt++;
} int main()
{
int i, j, k, x, y;
n = read();
m = read();
for(; m--;)
{
x = read();
y = read();
a[x][y] = ;
}
for(k = ; k <= n; k++)
for(i = ; i <= n; i++)
for(j = ; j <= n; j++)
a[i][j] |= (a[i][k] && a[k][j]);
memset(head, -, sizeof(head));
for(i = ; i <= n; i++)
for(j = ; j <= n; j++)
if(a[i][j])
add(i, j);
ans = n;
for(i = ; i <= n; i++)
{
memset(vis, , sizeof(vis));
ans -= find(i);
}
printf("%d\n", ans);
return ;
}
最新文章
- php js数组问题
- Oracle Contact By的使用
- 转载:css3 content 生成内容
- dbm速算
- 被FBI点名的中国黑客-Lion
- 安装Visual Studio2015后,使用VS2013开发的项目,在IIS访问都提示“公共语言运行时检测到无效的程序”的解决办法
- 【UVA11324】The Largest Clique (SCC)
- jquery 插件大全
- Swift—final关键字-b
- HDU 4739 求正方形个数
- 【Android笔记】MediaPlayer基本用法
- pc端的企业网站(IT修真院test9)详解一个响应式完成的pc端项目
- CTFcracktools——非常实用的CTF解密工具
- Vue中scoped css和css module比较
- China Tightens Recycling Import Rules
- 记SCOI2019
- Ubuntu18系统qt生成程序无法双击运行问题
- 【AtCoder】ARC076
- 使用pandas的部分问题汇总
- unity中实现场景之间加载进度条
热门文章
- Looper、MessageQueue、Message、Handler的关系
- Android 线程池系列教程(2)Thread,Runnable是基类及如何写Run方法
- 451 Sort Characters By Frequency 根据字符出现频率排序
- UnixTime的时间戳的转换
- hihocoder1710 等差子数列
- [BZOJ2005][NOI2010]能量采集 数学
- 虚拟机下安装 CentOS 7 的几个小问题
- [Windows Server 2008] 阿里云.云主机忘记密码解决方法
- Int 1的实现过程 (一)
- 迅为双核imx6DL核心板_ARM定制专家_Cortex SATA 千兆网 4G GPS