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的更多相关文章
随机推荐
- 19MVC设计模式
MVC设计模式 MVC英文即Model-View-Controller, 即把一个应用的输入.处理.输出流程按照Model.View.Controller的方式进行分离,这样一个应用被分成三个层——模 ...
- Python之list、tuple、dict、set
参考原文 廖雪峰Python PS:来看看Python中比较特殊的几种数据类型list.tuple.dict.set list list(列表)是Python内置的一种数据类型,它是一种有序.可变的集 ...
- Android 7.0系统代码调用安装apk时报错FileUriExposedException完美解决
项目更新遇到问题 Android项目开发中经常遇到下载更新的需求,以前调用系统安装器执行安装操作代码如下: Intent intent = new Intent(); intent.setActi ...
- 洛谷——P2018 消息传递
P2018 消息传递 题目描述 巴蜀国的社会等级森严,除了国王之外,每个人均有且只有一个直接上级,当然国王没有上级.如果A是B的上级,B是C的上级,那么A就是C的上级.绝对不会出现这样的关系:A是B的 ...
- 「 poj 2096 」 Collecting Bugs
先说一下题意 $s$ 个子系统还中有 $n$ 种 $\text{bug}$,每天可以随机选择一种 $\text{bug}$,问选出 $n$ 种 $\text{bug}$ 在 $s$ 种子系统中的期望天 ...
- 剑指offer---最小的K个数
题目:最小的K个数 要求:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. class Solution { public: ...
- 百练2755:神奇的口袋(简单dp)
描述有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40.John现在有n个想要得到的物品,每个物品的体积分别是a1,a2……an.John可以从这些物品中选择一些 ...
- 最接近的点配对(分治问题理解) && HDU 1007代码
题目大意: 给定一堆点集,在这一堆点集中找到一组点集它们之间的距离达到最短 对于HDU1007因为求圆的半径,所以距离还要除以2 普通情况下,可以将nge点,将任意两个点之间的距离都算一遍,在循环过程 ...
- [HDU3586]Information Disturbing(DP + 二分)
传送门 题意:给定一个带权无向树,要切断所有叶子节点和1号节点(总根)的联系,每次切断边的费用不能超过上限limit,问在保证总费用<=m下的最小的limit 二分答案,再 DP,看看最终结果是 ...
- [luoguP1941] 飞扬的小鸟(DP)
传送门 动归,用f[i][j]表示到达第I列高度为j时最少需要飞的次数,容易想到最裸的转移: f[i][j]=min(min(f[i-1][j-up[i-1]*k]+k),f[i-1][j+down[ ...