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

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;
}















分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics