首页 > 其他分享 > UVA1364 Knights of the Round Table | 点双连通分量

UVA1364 Knights of the Round Table | 点双连通分量

时间:2022-11-05 19:34:34浏览次数:103  
标签:cnt 点双 UVA1364 int ++ dfn low vv Table

主要就是一个性质:如果一个点双连通分量中有奇环,那么这个点双连通分量中的每个点都在至少一个奇环中。

# include <bits/stdc++.h>
using namespace std;
const int N = 1005;
int n,m;
bool w[N][N];
vector <int> g[N];
int dfn[N],low[N],dfntot = 0,s[N],top = 0,belong[N],cnt = 0;
vector <int> dcc[N];
int c[N];
bool Cut[N],F[N];
void tarjan(int x,int fa)
{
    dfn[x] = low[x] = ++dfntot;
    s[++top] = x;
    for(int i = 0; i < (int)g[x].size(); i++)
    {
        int v = g[x][i];
        if(v == fa) continue;
        if(!dfn[v])
        {
            tarjan(v,x);
            low[x] = min(low[x],low[v]);
            if(low[v] >= dfn[x])
            {
                ++cnt;
                dcc[cnt].push_back(x); int vv;
                do
                {
                    vv = s[top--];
                    dcc[cnt].push_back(vv);
                }while(vv != v);
            }
        }
        else low[x] = min(low[x],dfn[v]);
    }
    return;
}
bool dfs(int x,int col)
{
    c[x] = col;
    bool flag = 0;
    for(int i = 0; i < (int)g[x].size(); i++)
    {
        int v = g[x][i];
        if(belong[v] != belong[x]) continue;
        if(c[v] > 0 && c[v] == c[x]) return 1;
        else if(c[v] == 0) flag |= dfs(v,3 - col);
    }   
    return flag;
}
int main(void)
{
    while(~scanf("%d%d",&n,&m) && n)
    {
        for(int i = 1; i <= n; i++) 
        {
            for(int j = 1; j <= n; j++) w[i][j] = 0;
            g[i].clear();dcc[i].clear();
            dfn[i] = low[i] = c[i] = belong[i] = 0;
            F[i] = 0;
        }
        dfntot = 0,cnt = 0,top = 0;
        for(int i = 1; i <= m; i++) 
        {
            int u,v; scanf("%d%d",&u,&v);
            w[u][v] = w[v][u] = 1;
        }
        for(int i = 1; i <= n; i++)
        {
            for(int j = i + 1; j <= n; j++)
            {
                if(!w[i][j])
                {
                    g[i].push_back(j),g[j].push_back(i);
                }
            }
        }
        for(int i = 1; i <= n; i++) if(!dfn[i]) top = 0,tarjan(i,0);
        for(int i = 1; i <= cnt; i++)
        {
            // printf("dcc:%d\n",i);
            for(int j = 0; j < (int)dcc[i].size(); j++)
            {
                belong[dcc[i][j]] = i; c[dcc[i][j]] = 0;
            }
            // printf("\n");
            int ro = dcc[i][0];
            if(dfs(ro,1)) 
            {
                for(int j = 0; j < (int)dcc[i].size(); j++)
                {
                    F[dcc[i][j]] = 1;
                }
            }
        }
        int ans = 0;
        for(int i = 1; i <= n; i++) if(!F[i]) ++ans;
        printf("%d\n",ans);
    }

    return 0;
}

标签:cnt,点双,UVA1364,int,++,dfn,low,vv,Table
From: https://www.cnblogs.com/luyiming123blog/p/16860894.html

相关文章

  • 可编程渲染管线(Scriptable Render Pipeline, SRP)
    原文链接可编程渲染管线处理数据的流程可分为以下3大阶段1.应用阶段这个阶段大概会由CPU处理4件事情。首先会对模型数据进行可见性判断。模型数据由顶点位置、法线方......
  • C# Linq将DataTable中的某列转换成数组或者List
    //获取到的数据DataTablepicDt=GetPdmPoroductModelPictureData(productModelCode);//将productCode列转数组string[]arrPic=picDt.AsEnumerable().Select(d......
  • handsontable赋值加载表格后只显示部分单元格
    当行或者列太多的时候,handsontable为了加载速度。会只渲染部分数据。当页面有动作的时候才会再次渲染剩余数据。控制的相关属性为:viewportColumnRenderingOffset:200,//......
  • iptables端口重定向
    有些服务如果需要使用小于1433的端口号,就需要有root权限,这样会有安全问题,此时可以利用iptables的端口重定向功能来实现这个目的。如下例,访问目标主机的80端口,即是访问其808......
  • 原生javascript点击获取table表格数据
    1.ajax获取List数据xmlHttp.onreadystatechange=function(){if(xmlHttp.readyState==4&&xmlHttp.status==200){letreturnVal......
  • AI 作画《NBA球星动漫头像》| 用stable diffusion生成
    扩散模型原理扩散模型是一种概率模型,通过逐步去噪一个正态分布变量来学习数据分布p(x),对应于学习长度为t的固定马尔可夫链的反向过程。模型可以通过训练去噪自编码器来实现(T......
  • Linux中iptables自定义链
    [root@cloudos02~]#iptables-nvL--line-numberChainINPUT(policyACCEPT0packets,0bytes)numpktsbytestargetprotoptinoutsource......
  • IPTABLES 详解
    引言先来看一条常用的iptables命令:Iptables(-tfilter)-IINPUT-ptcp--dportssh/22-jACCEPT这一条命令,生成了一条规则。允许所有22端口的TCP连接。这条规则作用......
  • 原生javascript清空table表格
    本文主要分享一下原生javascript清空table表格的方法,仅供参考:lettable=document.getElementById("tableId");varlen=table.childNodes.length;for(leti=len-......
  • 学习笔记-Iptables
    Iptables什么是iptablesLinux系统在内核中提供了对报文数据包过滤和修改的官方项目名为Netfilter,它指的是Linux内核中的一个框架,它可以用于在不同阶段将某些钩子函......