`
暴风雪
  • 浏览: 390586 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

[点双连通分量-奇环判定]poj 2942:Knights of the Round Table

阅读更多

大致题意:

    给出一个无向图,求出这个图的补图G。求出在G中存在多少个点使得这些点不属于任何一个奇环中。

 

大致思路:
    这道题从一开始就是个杯具!先是把题目想成边的双连通分量做,狂哇。后来用割点的模版照着网上的代码改造出一个点双连通分量的代码,依然哇!!原因是同一个点可能属于不同的点双连通分量!!   后来把搜索染色的过程加到Tarjan里面,还是哇!!检查出来原因是搜索u的时候,起点并没有标记其在那一块双连通分量!!  前前后后花了我八天才AC……大概得终身难忘这道题了>_<   发图供大牛BS


 

给出一组可以判边双连通分量死刑的数据


 

#include<iostream>
#include<cstdio>
#include <algorithm>
#include<cstring>
using namespace std;
const int inf=1<<30;
const int nMax=30015;
const int mMax=5000000;

class edge{
public:
    int u,v,nex;
};edge e[mMax];
int k,k1,head[nMax];//head[i]是以点i为起点的链表头部
int dfn[nMax],low[nMax],sta[nMax],top,atype,belon[nMax],dep;   //Tarjan需要的数据记录 //atype 强连通分量的个数
bool insta[nMax];
int n,m;
int ans,vis[nMax],num[nMax];

void addedge(int a,int b){
    e[k].u=a;
    e[k].v=b;
    e[k].nex=head[a];
    head[a]=k;k++;
}

int change(int a){
    if(a==1)return 2;
    if(a==2)return 1;
    return 0;
}
int clor[nMax],cnt;

bool dfs(int loc,int val){
    int i,v;
    clor[loc]=val;
    for(i=head[loc];i;i=e[i].nex){
        v=e[i].v;
        if(atype!=belon[v])continue;
        if(clor[v]==0){
            if(!dfs(v,change(val))){
                return 0;
            }
        }
        else{
            if(clor[v]!=change(clor[loc])){
                return 0;
            }
        }
    }
    return 1;
}

void Tarjan(int u,int rt){                 //我的Tarjan模版
    int i,t;
    dfn[u]=low[u]=++dep;
    sta[++top]=u;
    insta[u]=1;
    for(i=head[u];i;i=e[i].nex){
        int v=e[i].v;
        if(v==rt)continue;
        if(!dfn[v]){
            Tarjan(v,u);
            low[u]=min(low[u],low[v]);
            if(dfn[u]<=low[v]){     ///要注意一个点可能同时属于不同的点双连通分量
                atype++;              //点双通分量个数
                do{
                    t=sta[top--];
                    insta[t]=0;
                    belon[t]=atype;   //第j个点属于第atype个连通块
                    num[++cnt]=t;
                }while(v!=t);
                num[++cnt]=u;
                memset(clor,0,sizeof(clor));
                if(cnt>=3&&!dfs(u,1)){ 
                    while(cnt>0)
                        vis[num[cnt--]]=1;
                }
                else cnt=0;
            }
        }
        else{
            if(insta[v])low[u]=min(low[u],dfn[v]);
        }
    }
}

void init(){
    k=k1=1;
    dep=1;
    top=atype=0;
    memset(insta,0,sizeof(insta)); //是否在栈中
    memset(head,0,sizeof(head));   //静态链表头指针
    memset(low,0,sizeof(low));     //Tarjan的low数组
    memset(dfn,0,sizeof(dfn));     //Tarjan的dfn数组
    memset(belon,0,sizeof(belon)); //记录每个点属于哪一个双连通分量
}


bool map[2000][2000];
int main(){
    int i,j,a,b;
    while(scanf("%d%d",&n,&m)!=EOF&&(n||m)){
        init();
        ans=0;
        cnt=0;
        memset(map,0,sizeof(map));
        while(m--){
            scanf("%d%d",&a,&b);
            map[a][b]=map[b][a]=1;
        }
        for(i=1;i<=n;i++){
            for(j=1;j<=n;j++){
                if(!map[i][j]&&i!=j){
                    addedge(i,j);
                }
            }
        }
        memset(vis,0,sizeof(vis));
        for(i=1;i<=n;i++){
            if(!dfn[i])Tarjan(i,-1);
        }
        for(i=1;i<=n;i++){
            if(!vis[i])ans++;
        }
        printf("%d\n",ans);
    }
    return 0;
}
 
  • 大小: 127.5 KB
  • 大小: 8.8 KB
0
0
分享到:
评论

相关推荐

    POJ2942-Knights of the Round Table【Tarjan算法】

    POJ2942-Knights of the Round Table 【Tarjan算法】 解题报告+AC代码 http://hi.csdn.net/!s/F3L8HO ================================== 我的POJ所有解题报告:...

    经典 的POJ 分类

    - POJ 2186:强连通分量的识别与分析。 #### 最大流最小割 - **题目示例**: - POJ 3352:最大流问题的求解。 ### 数据结构 #### 栈 - **题目示例**: - POJ 2528、POJ 2828:栈的基本操作与应用场景。 #### ...

    POJ 分类题目

    ### POJ 分类题目知识点详解 #### 一、基本算法 **1. 枚举** - **定义**:枚举是一种通过尝试所有可能情况来解决问题的方法。 - **示例题目**: - poj1753 - poj2965 - **应用场景**:适用于问题规模较小或解决...

    初学者练题开始------在POJ上(注:是百练)

    POJ(Problem Online Judge)是一个流行的在线编程练习平台,尤其适合初学者进行“百练”来巩固基础和提高解题能力。以下是一些从题目列表中抽取的知识点,涵盖多个编程领域: 1. **基础算法**: - **鸡兔同笼**...

    ACM题目分类.txt

    - **描述**:强连通分量是指有向图中的节点集合,其中任意两个节点都是相互可达的。 - **应用场景**:图的分析与结构化。 - **相关题目**: - POJ 3041 - POJ 3020 ### 数据结构 #### 1. 栈与队列 - **描述**:...

    acm新手训练方案新手必备

    ### ACM新手训练方案知识点详解 #### 一、基础算法与数据结构 在ACM竞赛中,基础算法与数据结构是入门必备的知识点。本部分主要介绍了一些基础算法及其应用场景。 ##### 1. 基础算法 - **排序**:如快速排序、...

    ACM北大训练

    - poj2942: 涉及双连通分量的识别问题。 ##### 4. 强连通分支及其缩点 - **定义**: 强连通分支是指图中的极大强连通子图。 - **应用场景**: 在图的分析中有重要应用。 - **示例题目**: - poj2186: 涉及强连通分支...

    POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类

    - **例题**:poj1860, poj3259, poj1062, poj2253, poj1125, poj2240 - **解释**:最短路径算法包括Dijkstra算法、Bellman-Ford算法、Floyd算法以及堆优化的Dijkstra算法等。 ##### (3) 最小生成树算法 - **例题**...

    POJ题目分类

    根据给定的信息,我们可以将POJ题目按照不同的类别进行详细的知识点分析与总结。下面将对每一类别的主要内容、特点及示例题目进行详细介绍。 ### 一、算法基础 #### 1. 搜索 - **内容**: 包括深度优先搜索(DFS)...

    acm训练计划(poj的题)

    - (poj2942):图的连通性和双连通组件的计算。 4. **强连通分量**: - (poj2186):如何找出一个有向图中的强连通分量。 5. **图的同构问题**: - (poj3352):判定两个图是否同构。 6. **小世界模型**: - ...

    POJ3177-Redundant Paths 【Tarjan-边双连通分量-缩点】

    POJ3177-Redundant Paths 【Tarjan-边双连通分量-缩点】 解题报告+AC代码+测试数据 http://hi.csdn.net/!s/GPAY6Z 附:我所有的POJ解题报告链接 . http://blog.csdn.net/lyy289065406/article/details/6642573

    poj题目分类

    ### POJ题目分类详解 #### 动态规划 (DP) **动态规划**是一种解决最优化问题的方法论,它通过将复杂的问题分解成一系列简单的子问题,并利用子问题的解来构造原问题的解。在本分类中,我们将详细介绍POJ平台上涉及...

    poj 图论 集合

    POJ2942 - Knights of the Round Table - **题目链接**:[POJ2942](http://acm.pku.edu.cn/JudgeOnline/problem?id=2942) - **解法概述**:这是一道关于双连通分量的问题,需要判断图是否双连通。 - **双连通分量...

    算法训练方案详解

    - **示例题目**: POJ 3267, POJ 1836, POJ 1260, POJ 2533, POJ 3176, POJ 1080, POJ 1159 - **注意事项**: 理解每种模型的状态定义和转移方程。 #### 六、数学 **1. 组合数学** - **定义**: 研究组合结构的...

    poj图论题目汇总

    - **知识点**:双联通分量算法,用于识别图中的双连通部分。 #### 3189 Steady Cow Assignment - 网络流 - **知识点**:网络流算法。 #### 3204 Ikki's Story I - Road Reconstruction - 最大流 - **知识点**:...

    ACM 新手指南 PKU 题目分类

    - 示例题目:POJ 3349, POJ 3274, POJ 2151, POJ 1840, POJ 2002, POJ 2503 ##### 2. 图算法 - **最短路径**:包括迪杰斯特拉算法(Dijkstra)、贝尔曼-福特算法(Bellman-Ford)等,适用于求解两点之间的最短...

    ACM 题型

    - 示例题目:poj1191, poj1054, poj3280, poj2029, poj2948, poj1925, poj3034 2. **四边形不等式** - 示例题目:POJ3254, poj2411, poj1185 3. **记忆化搜索** - 示例题目:poj2057, poj1947, poj2486, poj...

    acm竞赛----北大poj详细解题报告

    【ACM竞赛与北大POJ解题报告】 在编程竞赛领域,ACM(国际大学生程序设计竞赛,简称ACM/ICPC)是一项极具影响力的比赛,它挑战参赛者的算法设计、问题理解和快速编码能力。北京大学(Peking University)的在线判题...

    ACM算法经典书籍----最全最详细的书籍推荐!

    ### ACM算法经典书籍知识点梳理 #### 一、CLRS - **书名**: *Introduction to Algorithms*(简称CLRS) - **作者**: Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein - **特点**: 作为...

    ACM POJ PKU 最全题目分类

    ### ACM POJ PKU 最全题目分类解析 #### 动态规划(DP) 在计算机科学领域,动态规划(Dynamic Programming, DP)是一种重要的算法思想,主要用于解决多阶段决策过程中的优化问题。它通过将原问题分解成相互重叠的...

Global site tag (gtag.js) - Google Analytics