POJ2942 洛谷UVA1364(博主没有翻墙uva实在是太慢了)

以骑士为结点建立无向图,两个骑士间存在边表示两个骑士可以相邻(用邻接矩阵存图,初始化全为1,读入一对憎恨关系就删去一条边即可),则题意变为求图中不在任何奇环(结点数为奇数的环)中的点的数量。

一个环上的点一定属于一个双连通分量(两两都有两条路径可达)

那么什么时候双连通分量中没有奇环呢?

显然,当双连通分量是二分图的时候,图中没有奇环,因为从一个点出发回到该点一定要经过偶数条边。

非二分图的双连通分量一定含有奇环

那么,非二分图的双连通分量的每个点是否都在奇环中呢?

假设v,u1,u2属于同一个双连通分量,且已知u1,u2在奇环上。求证:v也在奇环上

因为u1,u2在奇环上,所以u1,u2在环上的两条路径一条长度为奇数,一条长度为偶数。故无论u1-v-u2的长度为奇数或偶数都可以以v,u1,u2构造一个奇圈

所以我们得到非二分图的双连通分量中的每个点都在奇环上

那么我们的任务就转换为求无向图中是二分图的双连通分量中点的个数

有了上面的分析,代码实现就很简单了

 #include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
using namespace std;
#define re register int
int graph[][];//邻接矩阵
int dfn[],dfs_clock,n,m,stack[],top,ans,queue[],left,right,color[];
int bccno[],bcc_cnt,tot;//各个点bcc编号、当前bcc编号、bcc结点数目
bool odd[];//每个点是否在奇圈上
int read()
{
int f=,x=;
char c=getchar();
while(!isdigit(c))
{
f=f|c=='-';
c=getchar();
}
while(isdigit(c))
{
x=(x<<)+(x<<)+(c^);
c=getchar();
}
return x;
}
bool bipartite(int x)//二分图判定
{
memset(color,,sizeof(color));
left=right=;
queue[]=x;
color[x]=;
while(right>=left)
{
int u=queue[left++];
for(re v=;v<=n;v++)
{
if(graph[u][v]&&bccno[v]==bcc_cnt)
{
if(color[v]==color[u])
return false;
else if(!color[v])
{
queue[++right]=v;
color[v]=^color[u];
}
}
}
}
return true;
}
int tarjan(int u,int fa)//求双连通分量
{
int lowu=dfn[u]=++dfs_clock;
for(re v=;v<=n;v++)
if(graph[u][v])
{
if(!dfn[v])
{
stack[++top]=v;
int lowv=tarjan(v,u);
lowu=min(lowu,lowv);
if(lowv>=dfn[u])
{
tot=;
bcc_cnt++;
while(stack[top]!=v)
{
tot++;
bccno[stack[top--]]=bcc_cnt;
}
tot+=;
bccno[stack[top--]]=bccno[u]=bcc_cnt;//割点不出栈
if(!bipartite(u))//不是二分图,则此BCC中的点均在奇圈上
for(re i=;i<=n;i++)
if(bccno[i]==bcc_cnt)
odd[i]=true;
}
}
else if(v!=fa)
lowu=min(lowu,dfn[v]);
}
return lowu;
}
void reset()
{
memset(bccno,,sizeof(bccno));
memset(dfn,,sizeof(dfn));
memset(odd,,sizeof(odd));
dfs_clock=bcc_cnt=ans=top=;
for(re i=;i<=n;i++)
for(re j=;j<=n;j++)
graph[i][j]=;
for(re i=;i<=n;i++)
graph[i][i]=;
}
int main()
{
while((n=read())&&(m=read()))
{
reset();
while(m--)
{
int u=read(),v=read();
graph[u][v]=graph[v][u]=;
}
for(re i=;i<=n;i++)
if(!dfn[i])
{
stack[++top]=i;
tarjan(i,i);
}
for(re i=;i<=n;i++)
if(!odd[i])
ans++;
printf("%d\n",ans);
}
return ;
}

Knights of the Round Table 圆桌骑士

POJ2942 UVA1364 Knights of the Round Table 圆桌骑士的更多相关文章

  1. poj 2942 Knights of the Round Table 圆桌骑士(双连通分量模板题)

    Knights of the Round Table Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 9169   Accep ...

  2. uvalive 3523 Knights of the Round Table 圆桌骑士(强连通+二分图)

    题目真心分析不出来.看了白书才明白,不过有点绕脑. 容易想到,把题目给的不相邻的关系,利用矩阵,反过来建图.既然是全部可行的关系,那么就应该能画出含奇数个点的环.求环即是求双连通分量:找出所有的双连通 ...

  3. KNIGHTS - Knights of the Round Table 圆桌骑士 点双 + 二分图判定

    ---题面--- 题解: 考场上只想到了找点双,,,,然后不知道怎么处理奇环的问题. 我们考虑对图取补集,这样两点之间连边就代表它们可以相邻, 那么一个点合法当且仅当有至少一个大小至少为3的奇环经过了 ...

  4. UVALive 3523 Knights of the Round Table 圆桌骑士 (无向图点双连通分量)

    由于互相憎恨的骑士不能相邻,把可以相邻的骑士连上无向边,会议要求是奇数,问题就是求不在任意一个简单奇圈上的结点个数. 如果不是二分图,一定存在一个奇圈,同一个双连通分量中其它点一定可以加入奇圈.很明显 ...

  5. [POJ2942][LA3523]Knights of the Round Table

    [POJ2942][LA3523]Knights of the Round Table 试题描述 Being a knight is a very attractive career: searchi ...

  6. UVA-1364.Knights of the Round Table 无向图BCC

    题目链接:https://vjudge.net/problem/UVA-1364 题意:有n个人参加会议,互相憎恨的人不能坐在相邻的位置,并且每个会议参加的人数必须是奇数,求有多少个人不能参加任何一个 ...

  7. 【poj2942】 Knights of the Round Table

    http://poj.org/problem?id=2942 (题目链接) 题意 有n个骑士要去参加圆桌会议,他们将围成一圈,想要他们不打架,当且仅当参加圆桌会议的骑士数为奇数并且相邻的两个骑士不互相 ...

  8. POJ2942:Knights of the Round Table——题解

    http://poj.org/problem?id=2942 所写的tarjan练习题最难的一道. 说白了难在考得不是纯tarjan. 首先我们把仇恨关系处理成非仇恨关系的图,然后找双连通分量,在双连 ...

  9. 【POJ2942】Knights of the Round Table(二分图 点双联通分量)

    题目链接 大意 给定\(N\)个点与\(M\)个关系,每个关系表示某两个点间没有直接的边相连,求不在所有奇环上的点的个数. (\(1\le N\le 1e3,1\le M\le 1e6\)) 思路 考 ...

随机推荐

  1. Linux_KVM虚拟机

    目录 目录 Hpyervisor的种类 安装KVM 使用virsh指令管理虚拟机 KVM虚拟机的网络设置 Hpyervisor的种类 hpyervisor:是一种VMM(Virtual Machine ...

  2. ES6标准入门 第五章:正则的扩展

    1.RegExp 构造函数 ES5的缺陷: ES5中构造函数的参数有两种情况: (1)参数是字符串,这时第二个参数表示正则表达式的的修饰符(flag). var reg = new RegExp( & ...

  3. 【MM系列】MB1A MB1B MB1C MB11 MIGO的区别解析

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]MB1A MB1B MB1C MB1 ...

  4. LeetCode算法题-Rectangle Overlap(Java实现)

    这是悦乐书的第325次更新,第348篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第195题(顺位题号是836).矩形表示为数组[x1,y1,x2,y2],其中(x1,y ...

  5. Java课堂疑问解答与思考3

    一. 两对整数明明完全一样,为何一个输出true,一个输出false? 答: 整数在小于127时都可以用常量池,因此第一次比较的的地址是取自同一个地址的数字,而第二次比较的数是创建了两个不同地址的对象 ...

  6. Java多线程学习——wait方法(信号灯法/生产者消费者模式)

    信号灯法:以一个标志位来判断是否执行还是等待 public class TV { private String voice; //内容 private boolean flag=false; //信号 ...

  7. Balanced Binary Tree(平衡二叉树)

    来源:https://leetcode.com/problems/balanced-binary-tree Given a binary tree, determine if it is height ...

  8. disabled_button 按钮按不下去

    X老师今天上课讲了前端知识,然后给了大家一个不能按的按钮,小宁惊奇地发现这个按钮按不下去,到底怎么才能按下去 检查元素 删除 按钮就可以摁了 出现答案

  9. 语言I—2019秋作业02

    这个作业属于那个课程 这个作业要求在哪里 我在这个课程的目标是 这个作业在那个具体方面帮助我实现目标 参考文献 C语言程序设计I https://edu.cnblogs.com/campus/zswx ...

  10. 联想Z485安装64位ubantu

    开始今天的正式写作之前不得不吐槽一下联想电脑,真的是很垃圾!联想Z485使用的是AMD的处理器,性能差的很,更让人不能忍的是,居然不能正常安装64位ubantu.这个情况让那些想在自己笔记电脑上安装T ...