【综合图论】PKU-2942-Knights of the Round Table

原创 2012年03月29日 19:58:03

综合性很强的一道图论题,用到了补图,双连通分量,二分图等几个知识点,这里有某位大牛的神解题报告点击打开链接

题目

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<stack>
using namespace std;
#define N 1005
vector<int> vec[N],lin[N];
stack<int> sta;
int n,step,cnt,ans,low[N],dfn[N],ins[N],col[N];
bool p[N][N];
void tarjan(int now,int pre)
{
    low[now]=dfn[now]=step++;
    sta.push(now);
    ins[now]=1;
    int len=vec[now].size();
    for(int i=0;i<len;i++)
    {
        int u=vec[now][i];
        if(u==pre)continue;
        if(dfn[u]==-1)
        {
            tarjan(u,now);
            low[now]=min(low[now],low[u]);
            if(low[u]>=dfn[now])
            {
                while(1)
                {
                    int x=sta.top();
                    sta.pop();
                    ins[x]=0;
                    lin[cnt].push_back(x);
                    if(u==x)break;
                }
                lin[cnt++].push_back(now);
            }
        }
        else
        {
            if(ins[u])low[now]=min(low[now],dfn[u]);
        }
    }
}
void dfs(int id,int u,int c)
{
    col[u]=c;
    int len=lin[id].size();
    for(int i=0;i<len;i++)
    {
        int x=lin[id][i];
        if(u==x||col[x]!=-1)continue;
        if(!p[u][x])dfs(id,x,c^1);            //找相邻的点染与当前点不同的色
    }
}
void slove()
{
    cnt=step=0;
    while(!sta.empty())sta.pop();
    memset(ins,0,sizeof(ins));
    memset(dfn,-1,sizeof(dfn));
    for(int i=0;i<n;i++)            //tarjan算法求连通分支
    {
        if(dfn[i]!=-1)continue;
        tarjan(i,-1);
    }
    bool ok[N];
    memset(ok,false,sizeof(ok));
    for(int i=0;i<cnt;i++)
    {
        memset(col,-1,sizeof(col));
        dfs(i,lin[i][0],0);            //染色
        int len=lin[i].size();
        bool flag=false;
        for(int j=0;j<len;j++)
        {
            for(int k=0;k<len;k++)
            {
                int x=lin[i][j];
                int y=lin[i][k];
                if(x!=y&&!p[x][y]&&col[x]==col[y])            //判断是否是二分图,如果x和y相邻并且他们同色就说明这个连通分支不是二分图
                {
                    flag=true;
                    break;
                }
            }
            if(flag)break;
        }
        if(flag)
        {
            for(int j=0;j<len;j++)ok[lin[i][j]]=true;            //不是二分图既是奇圈,里面的点都符合要求
        }
    }
    ans=0;
    for(int i=0;i<n;i++)
    {
        if(!ok[i])ans++;            //找出不在奇圈的点数
    }
}
int main()
{
    //freopen("a.txt","r",stdin);
    int m;
    while(scanf("%d%d",&n,&m)&&n+m)
    {
        memset(p,false,sizeof(p));
        for(int i=0;i<m;i++)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            x--,y--;
            p[x][y]=p[y][x]=true;
        }
        for(int i=0;i<n;i++)
        {
            vec[i].clear();
            lin[i].clear();
        }
        for(int i=0;i<n;i++)            //取补图
        {
            for(int j=0;j<n;j++)
            {
                if(p[i][j]&&i!=j)continue;
                vec[i].push_back(j);
            }
        }
        slove();
        printf("%d\n",ans);
    }
    return 0;
}


Knights of the Round Table

题目链接 题意: n个人开会,会议人数至少为三且为奇数。有些人相互憎恨,这些人不能邻座。统计有几个人不能参加任意一个会议 输入:n,m。m行包括两个整数k1、k2表示两个人相互憎恨。...
  • u012476429
  • u012476429
  • 2014年03月28日 10:52
  • 1053

各大Oj经典图论500题

=============================以下是最小生成树+并查集====================================== 【HDU】 *1213       ...
  • liujian20150808
  • liujian20150808
  • 2016年03月10日 13:28
  • 1754

POJ2942-Knights of the Round Table

转载请注明出处:優YoU http://blog.csdn.net/lyy289065406/article/details/6756821     大致题意: 亚瑟王要在圆桌上召开骑士会议,...
  • lyy289065406
  • lyy289065406
  • 2011年09月07日 15:04
  • 7705

LA 3523 Knights of the Round Table(点双连通分量+二分图判断)

题意:有n个骑士经常举行圆桌会议,商讨大事,每次圆桌会议至少应有3个骑士参加,且互相憎恨的骑士不能坐在圆桌旁的相邻位置,如果发生意见分歧,则需要举手表决,因此参加会议的骑士数目必须是奇数,以防赞同和反...
  • u014258433
  • u014258433
  • 2016年07月24日 15:37
  • 260

【图论】[POJ 2942]Knights of the Round Table

先找连通图,然后检查是否是二分图注意如果是在线的算法记得要清空Color数组因为存在一种情况儿子中含有两个连通图,那么自己儿子中就会存在一个割点已经被染了色,就有可能存在冲突。#include #i...
  • JeremyGJY
  • JeremyGJY
  • 2015年07月23日 11:08
  • 270

OCP-1Z0-051 第75题 round和rpad函数

一、原题 The following data exists in the PRODUCTS table: PROD_ID   PROD_LIST_PRICE 123456     152525...
  • hollo_hhy
  • hollo_hhy
  • 2014年05月08日 11:48
  • 2971

[NOI 2008]假面舞会(综合图论)

【题目大意】:一共有n个人,每个人都带着面具,然后一共有k类面具,并且知道k>=3。只有带第i-1类面具的人能看到带第i类面具的人,带第k类面具的人能看到带第1类面具的人。告诉你m个信息,谁能看到谁。...
  • Skyprophet
  • Skyprophet
  • 2010年04月20日 19:50
  • 985

图论汇总

开学开始刷~ 最短路问题 此类问题类型不多,变形较少 POJ 2449 Remmarguts' Date(中等) http://acm.pku.edu.cn/JudgeOnline...
  • zhou_yujia
  • zhou_yujia
  • 2016年02月03日 11:31
  • 1177

·图论与动态规划

1  找无环
  • brandohero
  • brandohero
  • 2014年10月15日 12:42
  • 835

Python 图论工具

networkx: 一个用Python语言开发的图论与复杂网络建模工具, 内置了常用的图与复杂网络分析算法, 可以方便的进行复杂网络数据分析、仿真建模等工作。 依赖工具: numpy  p...
  • u011659057
  • u011659057
  • 2014年06月17日 20:20
  • 2198
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【综合图论】PKU-2942-Knights of the Round Table
举报原因:
原因补充:

(最多只允许输入30个字)