边双联通分量

具体详解蓝书上十分详细,因为必须是奇数个人坐在一起,那么一个人如果能选上,就必须处在一个简单奇圈中。而奇圈也是一个边双联通分量,所以我们先把边双联通分量都挖出来,然后进行二分图染色。

奇圈不能被二分图染色,所以标记所有不能被染色的点,减去就是答案

#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的更多相关文章

随机推荐

  1. Uploadify上传大文件

    一丶参考地址 <script type="text/javascript"> var auth = "@(Request.Cookies[FormsAuthe ...

  2. Invalid ON UPDATE clause for 'create_date' column

    高版本的mysql导数据到低版本出现的问题 日期类型报错 解决方式:将datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT  中的  ON ...

  3. 打造完美的ImageLoader——LruCache+DiskLruCache

    做android应用少不了要和网络打交道,在我刚开始学android的时候总是处理不好网络图片的加载,尤其是图片乱跳的问题,后来发现了各种缓存图片的方法:本地缓存.软引用.LruCache.... 我 ...

  4. zip相关知识梳理(一)

    zip相关知识梳理(一) 经过对zip文件的长时间研究,对zip文件进行相关知识进行梳理,虽然网上很多牛人对其做了相关基础解析,但是对于特殊情况没有进行说明,比如超过4G的zip文件该以什么格式进行编 ...

  5. 十二届 - CSU 1803 :2016(同余定理)

    题目地址:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1803 Knowledge Point: 同余定理:两个整数a.b,若它们除以整数m所 ...

  6. Luogu P3797 妖梦斩木棒

    解题思路 用线段树做这个就不用说了吧,但是要维护的东西确实很神奇.在每一个节点上都维护一个$lbkt$,表示这个区间上最靠左的右括号的位置:一个$rbkt$,表示这个区间上最靠右的左括号的位置.还有一 ...

  7. DTD 文件的引入

    MyBatis 有两种配置文件:核心配置文件(mybatis- config.xml)和 SQL 映射文件(mapper.xml).这两种配置文件都需要手动引入各自的 DTD 文件(mybatis-3 ...

  8. react入门----基础语法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. hdu 2604 矩阵快速幂模板题

    /* 矩阵快速幂: 第n个人如果是m,有f(n-1)种合法结果 第n个人如果是f,对于第n-1和n-2个人有四种ff,fm,mf,mm其中合法的只有fm和mm 对于ffm第n-3个人只能是m那么有f( ...

  10. 递归算法(java)

    最近在用EasyUI中的tree遍历节点的时候用到了递归算法,现总结如下: * 递归算法:在函数里调用自身,但必须确定递归出口,即结束条件,不然就是无限循环:  * 递归一般解决的问题:       ...