poj 2942 Knights of the Round Table 点重联通分量

简介:

  书上把这放在边联通的第一道题,于是一开始就按边写了,一直写不对,重新想了一遍,才发现是点联通……


/*
author:jxy
lang:C/C++
university:China,Xidian University
**If you need to reprint,please indicate the source**
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <vector>
#include <stack>
#define pb push_back
using namespace std;
int n,m;
int Map[1005][1005];
vector<int> org[1005];
vector<int> belong[1005];
int vis[1005];
int dph[1005],low[1005];
int d;
int num=0;
bool ok[1005];
stack<int> S;
void dfs(int v,int f)
{
    vis[v]=1;
    dph[v]=low[v]=d++;
    S.push(v);
    for(int i=0; i<org[v].size(); i++)
    {
        int u=org[v][i];
        if(u==f)continue;
        if(vis[u]==1)low[v]=min(low[v],dph[u]);
        else if(!vis[u])
        {
            dfs(u,v);
            low[v]=min(low[v],low[u]);
            if(low[u]>=dph[v])
            {
                num++;
                belong[v].pb(num);
                belong[u].pb(num);
                while(S.top()!=u)// 注意边界,如果吧push放在for循环里就是!=v不用pop,否则就是!=u最后还要pop
                {
                    belong[S.top()].pb(num);
                    S.pop();
                }
                S.pop();
            }
        }
    }
    vis[v]=2;
}
int Tarjan() //搜索重联通分量
{
    num=0;
    while(!S.empty())S.pop();
    for(int i=1; i<=n; i++)
    {
        d=0;
        if(!vis[i])
            dfs(i,-1);
    }
}
int dye(int v,int c,int flag)//1,-1染色
{
    vis[v]=c;
    for(int i=0; i<org[v].size(); i++)
    {
        int &u=org[v][i];
        if(ok[u])
        {
            if(vis[u]==0&&dye(u,-c,flag))return 1;
            if(vis[u]==c)return 1;
        }
    }
    return 0;
}
int use[1005];
int Count()
{
    int ans=0;

    memset(use,0,sizeof(use));
    for(int k=1; k<=num; k++)
    {
        memset(ok,0,sizeof(ok));
        memset(vis,0,sizeof(vis));
        for(int i=1; i<=n; i++)
        {
            if(find(belong[i].begin(),belong[i].end(),k)!=belong[i].end())
                ok[i]=1;
        }
        for(int i=1; i<=n; i++)
        {
            if(ok[i])
            {
                if(dye(i,1,k))
                    for(int j=1; j<=n; j++)
                        use[j]+=ok[j];
                break;
            }
        }
    }
    for(int i=1; i<=n; i++)
        if(!use[i])ans++;
    return ans;
}
int main()
{
    while(~scanf("%d%d",&n,&m)&&n+m)
    {
        int a,b;
        int i,j;
        memset(vis,0,sizeof(vis));
        memset(Map,0,sizeof(Map));
        for(i=1; i<=n; i++)
        {
            org[i].clear();
            belong[i].clear();
            Map[i][i]=1;
        }
        for(i=0; i<m; i++)
        {
            scanf("%d%d",&a,&b);
            Map[a][b]=Map[b][a]=1;
        }
        for(i=1; i<=n; i++) //建立不憎恨的图
        {
            for(j=i; j<=n; j++)
                if(!Map[i][j])
                {
                    org[i].pb(j);
                    org[j].pb(i);
                }
        }
        Tarjan();
        printf("%d\n",Count());
    }
}


目录
相关文章
|
算法
poj 2479 Maximum sum(求最大子段和的延伸)
看完最大连续子段和 的 dp算法 这个很容易理解,我用dplift[i]保存第1到第i个之间的最大子段和,dpright[i]保存第i到第n个之间的最大子段和,最终结果就是dplift[i]+dpright[i+1]中最大的一个。
50 0
|
6月前
|
C++
【PTA】​L1-048 矩阵A乘以B​ (C++)
【PTA】​L1-048 矩阵A乘以B​ (C++)
68 0
【PTA】​L1-048 矩阵A乘以B​ (C++)
|
机器学习/深度学习 C语言
PTA 6-4求n×n方阵四边元素之和
PTA第一节 矩阵四边元素之和
365 0
PTA 6-4求n×n方阵四边元素之和
[UVA1364 | POJ | NC]Knights of the Round Table | Tarjan 求点双 | 二分图 | 综合图论
我们可以很轻松地发现,被提出的都是在点双连通分量之外的,比如该图中的1 和 5 ,那么怎么判断哪些点不在环中呢? 此时我们还可以逆向思考,不 在 环 中 的 = = 总 的 − 在 环 中 的,所以说现在问题就转换成了满足条件的环内的点的个数
126 0
[UVA1364 | POJ | NC]Knights of the Round Table | Tarjan 求点双 | 二分图 | 综合图论
【欧拉计划第 11 题】 网格中的最大乘积 Largest product in a grid
【欧拉计划第 11 题】 网格中的最大乘积 Largest product in a grid
170 0
【欧拉计划第 11 题】 网格中的最大乘积 Largest product in a grid
|
编解码
Google Earth Engine ——MOD11A1/A2 V6产品提供1200×1200公里网格内的每日陆地表面温度(LST)和发射率值1KM分辨率数据集
Google Earth Engine ——MOD11A1/A2 V6产品提供1200×1200公里网格内的每日陆地表面温度(LST)和发射率值1KM分辨率数据集
761 0
Google Earth Engine ——MOD11A1/A2 V6产品提供1200×1200公里网格内的每日陆地表面温度(LST)和发射率值1KM分辨率数据集
【PTA】7-3 判断上三角矩阵 (15分)
【PTA】7-3 判断上三角矩阵 (15分)
2173 0