`
java-mans
  • 浏览: 11738844 次
文章分类
社区版块
存档分类
最新评论

POJ 2942 点的双连通分量

 
阅读更多

终于a了!!!我勒个去。。。往往在无数次wa后重敲一遍就能ac。。。这句话很经典~

找了个ac程序对拍,结果发现那个ac程序错了,但是我交那个程序居然能ac!!我擦!!poj数据弱爆了啊!!尼玛还是专门用来卡哥的??

poj上一句很欠扁的话啊,虽然哥的程序是错的,但就是能ac!。。。艹!!彻底瞎了!!!!

然后又找了个ac程序对拍,自己生成的随即数据都tm有80mb了啊!!!可是答案都是一样的,令我很纠结。。。我又交了一遍,还是wa,无语凝噎,然后和小爽去吃饭,他说他有很多题都是这样。。。思路清楚的一逼,就是wa。。。- -!尼玛ac一题和会做一题还真是不一样的概念啊!!╮(╯▽╰)╭

晚上继续debug。。。快崩溃了,这种没测试数据的题目刷的真难受。。。

我感觉我的找错能力灰常强的,为什么就是wa啊!!!

无奈之下重敲了一遍。。。。。

后面发现居然是一个地方的now写成s.back()了,我擦!!!!tmd劳资直接撞死算了!!!!

#include<iostream>
#include<vector>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<stack>
#include<string>
#include<map>
#include<set>
#include<cmath>
#include<cassert>
#include<cstring>
#include<iomanip>
using namespace std;

#ifdef _WIN32
#define i64 __int64
#define out64 "%I64d\n"
#define in64 "%I64d"
#else
#define i64 long long
#define out64 "%lld\n"
#define in64 "%lld"
#endif

#define FOR(i,a,b)      for( int i = (a) ; i <= (b) ; i ++)
#define FF(i,a)         for( int i = 0 ; i < (a) ; i ++)
#define FFD(i,a)        for( int i = (a)-1 ; i >= 0 ; i --)
#define S64(a)          scanf(in64,&a)
#define SS(a)           scanf("%d",&a)
#define LL(a)           ((a)<<1)
#define RR(a)           (((a)<<1)+1)
#define SZ(a)           ((int)a.size())
#define PP(n,m,a)       puts("---");FF(i,n){FF(j,m)cout << a[i][j] << ' ';puts("");}
#define pb              push_back
#define CL(Q)           while(!Q.empty())Q.pop()
#define MM(name,what)   memset(name,what,sizeof(name))
#define read            freopen("in.txt","r",stdin)
#define write           freopen("out.txt","w",stdout)

const int inf = 0x3f3f3f3f;
const i64 inf64 = 0x3f3f3f3f3f3f3f3fLL;
const double oo = 10e9;
const double eps = 10e-10;
const double pi = acos(-1.0);
const int maxn = 1011;

int n,m;
vector<int>g[maxn];
vector<int>lk[maxn];
vector<int>s;
queue<int>q;
bool hash[maxn][maxn];
int dfn[maxn];
int low[maxn];
bool ins[maxn];
int col[maxn];
bool you[maxn];
bool can[maxn];
int t[maxn];
int df,nf;
int x,y;
bool ok;
int ans;


void tarjan(int now)
{
    int to,temp;
    dfn[now]=low[now]=df++;
    s.push_back(now);
    FF(i,g[now].size())
    {
        to=g[now][i];

        if(to == t[now])
        {
            continue;
        }
        if(!dfn[to])
        {
            t[to]=now;
            tarjan(to);
            low[now]=min(low[to],low[now]);
            if(dfn[now] <= low[to])
            {
                do{
                    temp = s.back();
                    lk[nf].push_back(temp);
                    s.pop_back();
                }while(temp != to);
                lk[nf++].push_back(now);
            }
        }
        else
        {
            low[now]=min(low[now],dfn[to]);
        }
    }
}

void start()
{
    MM(dfn,0);
    for(int i=1;i<=n;i++)
    {
        low[i]=inf;
    }
    MM(ins,false);
    MM(hash,false);
    MM(t,-1);
    MM(col,0);
    MM(can,false);
    FF(i,maxn)
    {
        lk[i].clear();
    }
    s.clear();
    df=nf=1;
    for(int i=1;i<=n;i++)
    {
        if(!dfn[i])
        {
            tarjan(i);
        }
    }
    nf--;

    int now,to;
    for(int i=1;i<=nf;i++)
    {
        if(lk[i].size()<2)
        {
            continue;
        }
        MM(you,false);
        MM(col,0);
        CL(q);
        FF(j,lk[i].size())
        {
            now=lk[i][j];
            you[now]=true;
        }
        q.push(lk[i][0]);
        col[lk[i][0]]=1;
        ok = false;
        while(!q.empty())
        {
            now=q.front();
            q.pop();
            FF(u,g[now].size())
            {
                to=g[now][u];
                if(!you[to])
                {
                    continue;
                }
                if(!col[to])
                {
                    col[to]=-col[now];
                    q.push(to);
                }
                else if(col[now]==col[to])
                {
                    ok=true;
                    break;
                }
            }
            if(ok)
            {
                break;
            }
        }
        if(ok)
        {
            FF(u,lk[i].size())
            {
                now=lk[i][u];
                can[now]=true;
            }
        }
    }
    ans=0;
    FOR(i,1,n)
    {
        if(!can[i])
        {
            ans++;
        }
    }
    cout<<ans<<endl;
    return ;
}

int main()
{
    while(cin>>n>>m)
    {
        if(!n && !m)
        {
            break;
        }
        MM(hash,false);
        FF(i,maxn)
        {
            g[i].clear();
        }
        for(int i=1;i<=m;i++)
        {
            cin>>x>>y;
            hash[x][y] = true;
            hash[y][x] = true;
        }
        FOR(i,1,n) FOR(j,1,n)
        {
            if(i == j)
            {
                continue;
            }
            if(!hash[i][j])
            {
                g[i].push_back(j);
            }
        }
        start();
    }

    return 0;
}















分享到:
评论

相关推荐

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

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

    POJ3352-Road Construction 【Tarjan-边双连通分量-缩点】

    POJ3352-Road Construction 【Tarjan-边双连通分量-缩点】 解题报告+AC代码 http://hi.csdn.net/!s/0T8UO5 附:我所有的POJ解题报告链接 . http://blog.csdn.net/lyy289065406/article/details/6642573

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

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

    poj题目分类

    * 双连通分量:例如 poj2942。 * 强连通分支及其缩点:例如 poj2186。 * 图的割边和割点:例如 poj3352。 * 最小割模型、网络流规约:例如 poj3308。 3. 数据结构: * 线段树:例如 poj2528、poj2828、poj2777...

    POJ2186-Popular Cows【Tarjan+极大强连通分量+缩点】

    POJ2186-Popular Cows ...【Tarjan+极大强连通分量+缩点】 解题报告+AC代码 http://hi.csdn.net/!s/BGDH68 附:我所有的POJ解题报告链接 . http://blog.csdn.net/lyy289065406/article/details/6642573

    acm训练计划(poj的题)

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

    POJ算法题目分类

    * 叉积和点积的运用:叉积和点积的运用是指解决问题的叉积和点积的运用算法,如 poj2031、poj1039。 * 多边型的简单算法和相关判定:多边型的简单算法和相关判定是指解决问题的多边型的简单算法和相关判定算法,如 ...

    POJ1159-Palindrome

    【标签】"POJ 1159 Palindrome" 标签明确了这是关于回文的一个问题,回文是指正读反读都能读通的字符串,例如"madam"或"12321"。在编程中,回文的检测是字符串处理的基本操作,常常涉及字符串反转和比较。 **知识点...

    poj各种分类

    下面,我们将根据给定的部分内容,深入探讨POJ上的题目分类以及相关的知识点。 ### 一、基本算法 #### 枚举 枚举是一种基础的解题策略,通过逐一检查所有可能的情况来解决问题。例如,题目poj1753和poj2965可以...

    POJ2002-Squares

    【标题】"POJ2002-Squares"是一个经典的计算机编程题目,源自北京大学的在线判题系统(POJ,即PKU Online Judge)。这个题目主要涉及到算法设计和实现,尤其是数学和动态规划方面的知识。 【描述】"解题报告+AC代码...

    POj最接近点对问题

    POJ 最接近点对问题 ACM北大 using namespace std; struct Point { float x; float y; };

    POJ.rar_poj java_poj1048

    【标题】"POJ.rar_poj java_poj1048" 涉及的知识点主要围绕编程竞赛中的“约瑟夫环”问题,这里是一个加强版,使用Java语言进行解决。 【描述】"POJ1048,加强版的约瑟夫问题 难度中等" 提示我们,这个问题是编程...

    POJ 分类题目

    - **定义**:在图中找到所有的双连通分量。 - **示例题目**: - poj2942 - **应用场景**:适用于图的连通性分析。 **6. 强连通分支及其缩点** - **定义**:找到图中的强连通分支并进行缩点。 - **示例题目**: - ...

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

    根据提供的信息,我们可以总结出以下相关的IT知识点,主要聚焦于编程竞赛中的算法和技术: ### POJ分类概述 ...以上提到的知识点仅为部分分类,POJ平台还包含了更多类型的题目,供有兴趣的人士进一步探索和学习。

    poj训练计划.doc

    - 最短路径算法:如Dijkstra算法和Bellman-Ford算法,用于找到两点间的最短路径,如`poj1062, poj2253`。 - 最小生成树算法:如Prim算法和Kruskal算法,用于找出图中的最小生成树,如`poj1789, poj2485`。 - 拓扑...

    jihe.rar_2289_POJ 3714_poj3714_poj3714 Ra_visual c

    标题中的"jihe.rar_2289_POJ 3714_poj3714_poj3714 Ra_visual c" 提到了一个压缩文件,可能包含有关编程竞赛或算法解决的资源,特别是与POJ(Problem On Judge)平台上的问题3714相关的。"Ra_visual c"可能指的是...

    POJ1201-Intervals

    【标题】"POJ1201-Intervals" 是北京大学在线编程平台POJ上的一道题目,这道题目主要涉及计算机科学中的算法设计与分析,尤其是数据结构和时间复杂度优化方面的知识。 【描述】"北大POJ1201-Intervals 解题报告+AC...

    POJ1837-Balance

    【标题】"POJ1837-Balance"是一个在线编程竞赛题目,源自著名的编程练习平台POJ(Programming Online Judge)。这个题目旨在测试参赛者的算法设计和实现能力,特别是处理平衡问题的技巧。 【描述】"解题报告+AC代码...

    poj 3414解题报告

    poj 3414解题报告poj 3414解题报告poj 3414解题报告poj 3414解题报告

    poj 1012解题报告

    poj 1012解题报告poj 1012解题报告poj 1012解题报告poj 1012解题报告

Global site tag (gtag.js) - Google Analytics