边双联通分量

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

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

#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. day02 Python完结

    一. 常用数据类型及内置法 1 列表 定义: 列表是Python中内置有序.可变序列,列表的所有元素放在一对中括号“[]”中,并使用逗号分隔开: 当列表元素增加或删除时,列表对象自动进行扩展或收缩内存 ...

  2. 对vuex的一点理解

    vuex是vue.js的一个状态管理工具,它适用于解决平行组件之间的数据共享问题.一般情况下,我们更多的是父子组件之间通过props或$emit来实现传值,如何不满足以上情况那只有使用vuex进行解决 ...

  3. STL++?pb_ds平板电视初步探索

    什么是pb_ds? 除了众所周知的STL库,c++还自带了ext库(应该可以这么叫吧),其中有用pb_ds命名的名称空间(俗称平板电视).这个名称空间下有四个数据类型结构.这些都是鲜为人知的.经过测试 ...

  4. chrome://plugins 无法打开的解决方法,同时解决“该网页已屏蔽插件-adobe flash player”

    chrome打开想要看视频时提示该网页已屏蔽插件-adobe flash player,在网上查了半天说在chrome plugins里面打开就可以了.可是chrome://plugins 无法打开, ...

  5. python3接口测试某个模块的很多接口有的用post有的用get

    没啥好说的,啊哈哈  大神提示可以判断下用post还是get,但是加到哪里合适呢?仔细看认真看 耶耶耶

  6. flex多列布局遇到的问题,和解决方案

    flex布局无疑是简单.易用的,他让我我们的布局更加简单和快速,但是在使用flex进行多列布局的时候,我相信很多人会遇到下面的情况: 这种情况是因为我们使用了justify-content: spac ...

  7. Hashing - Hard Version

    Hashing - Hard Version Given a hash table of size N, we can define a hash function . Suppose that th ...

  8. Ajax提交post请求返回404错误

    最近使用ajax提交表单的时候,发现无法执行success函数,后台的代码也正常执行了,但是就是无法执行success函数,执行error函数,返回的错误代码时404.显然是找不到请求的url. 可是 ...

  9. 你的ExcelUtil简单、高效、易扩展吗

    你的ExcelUtil简单.高效.易扩展吗 Author: Dorae Date: 2018年10月23日12:30:15 转载请注明出处 一.背景 最近接到了和Excel导出相关的需求,但是: 项目 ...

  10. iphone学习

    苹果开发者联盟的网址:http://www.apple.com.cn/developer/ objective-C on the Mac     (Aoress)       作者:Dakrymple ...