bzoj2841
边双联通分量
具体详解蓝书上十分详细,因为必须是奇数个人坐在一起,那么一个人如果能选上,就必须处在一个简单奇圈中。而奇圈也是一个边双联通分量,所以我们先把边双联通分量都挖出来,然后进行二分图染色。
奇圈不能被二分图染色,所以标记所有不能被染色的点,减去就是答案
#include<bits/stdc++.h>
using namespace std;
const int N = ;
int n, top, cnt, tot, color, ans, m;
int dfn[N], low[N], st[N], vis[N], col[N], mark[N], head[N];
struct edge {
int nxt, to;
} e[N << ];
vector<int> G[N];
void link(int u, int v)
{
e[++cnt].nxt = head[u];
head[u] = cnt;
e[cnt].to = v;
}
void tarjan(int u, int last)
{
dfn[u] = low[u] = ++tot; st[++top] = u;
for(int i = head[u]; i; i = e[i].nxt) if(e[i].to != last)
{
if(!dfn[e[i].to])
tarjan(e[i].to, u);
if(dfn[e[i].to] != -)
low[u] = min(low[u], low[e[i].to]);
}
if(low[u] == dfn[u])
{
++color;
while(st[top + ] != u)
{
dfn[st[top]] = -;
col[st[top]] = color;
--top;
}
}
}
bool dfs(int u, int c)
{
vis[u] = c;
for(int i = ; i < G[u].size(); ++i)
{
int v = G[u][i];
if(vis[v] == c) return false;
if(!vis[v])
if(!dfs(v, c ^ ))
return false;
}
return true;
}
int main()
{
scanf("%d%d", &n, &m);
for(int i = ; i <= m; ++i)
{
int u, v; scanf("%d%d", &u, &v);
link(u, v);
link(v, u);
}
for(int i = ; i <= n; ++i)
if(!dfn[i])
tarjan(i, );
for(int i = ; i <= n; ++i)
for(int j = head[i]; j; j = e[j].nxt)
if(col[e[j].to] == col[i])
{
G[e[j].to].push_back(i);
G[i].push_back(e[j].to);
}
memset(vis, -, sizeof(vis));
for(int i = ; i <= n; ++i)
if(vis[i] == - && !dfs(i, ))
mark[col[i]] = ;
ans = n;
for(int i = ; i <= n; ++i)
if(mark[col[i]])
--ans;
printf("%d\n", ans);
return ;
}
bzoj2841的更多相关文章
随机推荐
- python lambda简易使用
基本格式 lambda 变量名:函数表达式 ①直接使用 f=lambda x:x**2 f(3) ②设置函数列表 l=[lambda x:x**2, lambda x:x**3, lambda x:x ...
- Platform 获取主机系统信息
该模块用来访问平台相关属性. 常见属性和方法 1. import platform(pip install platform) 2.获取操作系统名称及版本号 def get_platform(): ...
- LINUX-RPM 包 - (Fedora, Redhat及类似系统)
rpm -ivh package.rpm 安装一个rpm包 rpm -ivh --nodeeps package.rpm 安装一个rpm包而忽略依赖关系警告 rpm -U package.rpm 更新 ...
- 第十五节:Web爬虫之selenium动态渲染爬取
selenium是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firef ...
- Spring核心技术(二)——Spring的依赖及其注入
本文将继续前文,描述Spring IoC中的依赖处理. 依赖 一般情况下企业应用不会只有一个对象(或者是Spring Bean).甚至最简单的应用都要多个对象来协同工作来让终端用户看到一个完整的应用的 ...
- 负载均衡之Ocelot
Ocelot 负载均衡: 背景知识,ocelot是基于 webapi 的网关框架,要使用ocelot来做路由转发和负载均衡,需要创建一个webapi,然后以这个webapi来做gateway. ...
- String类的转换功能
/* * String类的转换功能 * char[] toCharArray():把字符串转换为字符数组 * String toLowerCase():把字符串转换为小写字符串 * String to ...
- Node+Express中请求和响应对象
在用 Express 构建 Web 服务器时,大部分工作都是从请求对象开始,到响应对象终止. url的组成: 协议协议确定如何传输请求.我们主要是处理 http 和 https.其他常见的协议还有 f ...
- HDU 1203 背包问题
题目大意: 根据学校的申请费用,根据已有的钱得到最大的offer率 这里很明显就是一个价值为概率的背包问题 计算两个offer合并的概率 为a + b - a*b #include <cstdi ...
- 工资(money)
(money/money.in/money.out) 时限1000ms 内存256MB 聪哥在暑假参加了打零工的活动,这个活动分为n个工作日,每个工作日的工资为Vi.有m个结算工钱的时间,聪哥可以自由 ...