首页 > 其他分享 >P11022 「LAOI-6」Yet Another Graph Coloration Problem

P11022 「LAOI-6」Yet Another Graph Coloration Problem

时间:2024-10-13 14:22:38浏览次数:1  
标签:cnt 黑色 int Graph LAOI dcc dfn P11022 low

P11022 「LAOI-6」Yet Another Graph Coloration Problem - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

关于无解情况,如果这个图有两块连通块,那么不可能同时有黑色白色,假设 \(1,2\) 连通块,设 \(1\) 中有黑色,因为 \(2\) 中点不能到 \(1\),所以 \(2\) 中只能是黑色,又因为 \(2\) 中都是黑色,\(1\) 中点不能到 \(2\),所以 \(1\) 中点都是黑色,所以一个图全是黑色。 所以只能是一整块连通图。

先考虑贪心,先把所有点变成白色,看看那些点能变为黑色。

容易发现,对于一个无出边的环,可以随便选黑色,但如果有出边,即有桥的话,桥相连点只能是同色,可以发现只要有环,那么就可以选出来两种颜色,即一定有解。而如果这张图没有环,即是一个树,那么两点不可能存在多个简单路径,因此无解。

所以,我们可以先给桥边点标记。然后从点 1 开始染黑色,并把和点 1 相连的,非同一双连通分量(即环)里的桥点也染成黑色即可。

此题结束。

注意,对于大测试量,不要循环 memset 容易爆,要采用循环清空。

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>

using namespace std;

const int N = 200010, M = N * 2;

int h[N], ne[M], e[M], idx;
int n, m;
int dfn[N], timestamp, dcc_cnt, low[N];
int stk[N], top, id[N];
bool st[N], flag1;
bool B[N];
vector<int> g[N];

void add(int a, int b)
{
    e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}

void tarjan(int u, int from)
{
    dfn[u] = low[u] = ++ timestamp;
    stk[ ++ top] = u;
    
    for (int i = h[u]; i != -1; i = ne[i])
    {
        int j = e[i];
        if (!dfn[j])
        {
            tarjan(j, i);
            low[u] = min(low[u], low[j]);
            
            if (dfn[u] < low[j])
            {
                st[u] = st[j] = true;
            }
        }
        else if (i != (from ^ 1))
        {
            low[u] = min(low[u], dfn[j]);
        }
    }
    
    if (dfn[u] == low[u])
    {
        int y;
        dcc_cnt ++ ;
        
        do {
            y = stk[top -- ];
            id[y] = dcc_cnt;
            g[dcc_cnt].push_back(y);
        }while (y != u);
        if (g[dcc_cnt].size() >= 3) flag1 = true; // 说明有环
    }
}

void dfs(int u)
{
    B[u] = 1;
    for (int i = h[u]; i != -1; i = ne[i])
    {
        int j = e[i];
        if (st[j] && id[u] != id[j] && !B[j])
            dfs(j);
    }
}

int main()
{   
    int T;
    cin >> T;
    
    while (T -- )
    {
        cin >> n >> m;
        
        for (int i = 1; i <= n; i ++ )
        {
            st[i] = 0;
            dfn[i] = 0;
            h[i] = -1;
            top = 0;
            g[i].clear();
            B[i] = 0;
        }
        
        idx = dcc_cnt = 0;
        flag1 = 0;
        timestamp = 0;
        
        while (m -- )
        {
            int a, b;
            scanf("%d%d", &a, &b);
            add(a, b);
            add(b, a);
        }
        
        int cnt = 0;
        for (int i = 1; i <= n; i ++ )
            if (!dfn[i])
            {
                tarjan(i, -1);
                cnt ++ ;   
            }
            
        if (cnt > 1)
        {
            puts("-1");
            continue;
        }
        
        if (flag1) 
        {
            dfs(1);
            for (int i = 1; i <= n; i ++ )
            {
                if (B[i]) putchar('B');
                else putchar('W');
            }
        }
        else 
        {
            puts("-1");
            continue;
        }
        puts("");
    }
    
    return 0;
    
}

标签:cnt,黑色,int,Graph,LAOI,dcc,dfn,P11022,low
From: https://www.cnblogs.com/blind5883/p/18462262

相关文章

  • COMP3811 Computer Graphics
    SchoolofComputing:assessmentbriefModuletitleComputerGraphicsModulecodeCOMP3811AssignmenttitleCoursework1AssignmenttypeanddescriptionProgrammingassignment:GraphicsfundamentalsRationaleThecourseworkrevolvesaroundfundamentalgra......
  • Tabular and Graphical Displays
    Lab#1–TabularandGraphicalDisplaysObjectives:Attheendofthislab,youwillbeableto:FinddescriptivestatisticsusingExcelandSPSSIdentifyappropriatewaystosummarizedataExplorerelationshipsusingcrosstabulation/contingencytables......
  • SIGGRAPH Asia 2024 | 网易伏羲研究成果入选,3D面部动画技术再获新突破
    近日,国际计算机图形与交互技术顶会SIGGRAPHAsia2024公布论文接收结果:网易伏羲最新研究成果《FreeAvatar:Robust3DFacialAnimationTransferbyLearninganExpressionFoundationModel》成功入选。今年12月,SIGGRAPHAsia2024大会将在日本东京举行,届时网易伏羲实验室视觉......
  • Graphviz是一个开源的图形可视化软件
    官网没有给出代码示例,所以需要自己琢磨,这里最底下给了一些简单的,确实可以出很好看的图片Graphviz介绍Graphviz是一个开源的图形可视化软件,主要用于绘制各种类型的图表,如流程图、结构图、网络拓扑图等。它通过一种简单的文本表示语言(称为DOT语言)来创建和可视化图形......
  • GeoKR系列--Geographical Knowledge-Driven Representation Learning for Remote Sens
    一、abstract1.绝大多数遥感图像仍未标注,想要充分利用这些未标注的图像,本文提出了一种基于地理知识驱动的表示学习方法,使得提升遥感图像的网络性能+减少对标注数据的需求。2.本文将全球地表覆盖产品和与每张遥感图像相关的地理位置视为地理知识,为了消除遥感图像与地理知识之......
  • COMP612 Computer Graphics Programming
    COMP612ComputerGraphicsProgrammingSemester2,2024Project:HelicopterSceneThisisanindividualassignment.Allworkyousubmitmustbeentirelyyourown.Theassignmentisworth70%andwillbemarkedoutof100.Youmustworkfromtheprovided......
  • postman的post方法中Body项里,none,form-data,x-www-form-urlencoded,raw,binary,Grap
    目录1.None2.form-data3.x-www-form-urlencoded4.raw5.binary6.GraphQL总结在Postman中,使用POST方式时,Body项中有几种不同的数据传输方式可供选择,它们之间的主要区别在于数据的格式和编码方式。以下是每种类型的详细解释:1.None描述:不发送请求体(body)。用途:如果你......
  • Hidden Bipartite Graph
    HiddenBipartiteGraph题意交互题。有一个\(n\le600\)的图,你可以询问至多\(20000\)次。每次问一个点集\(S\),返回满足两个端点都在\(S\)中的边的个数。你需要判断这个图是不是二分图,如果是,则分别输出左部和右部的点,否则按顺序输出任意一个奇环。思路先判断二分图。一......
  • CF 1805 D. A Wide, Wide Graph (*1800) 思维 + 树的直径
    CF1805D.AWide,WideGraph(*1800)思维+树的直径题目链接题意:思路:若当前点到最远的点的距离\(<k\),说明\(x\)自己成为一个联通块。并且我们知道距离任意一点最远的点一定是树直径的一个端点。反之,则与直径端点在同一个联通块。所以一个点要么独立成为联通块......
  • GraphQL、sequelize-typescript 、Apollo Server 4 实例
    新建项目文件夹$mkdirdemo$cddemo初始化TypeScript配置$npxtsc--init安装SequelizeSequelize-cli$npminstall--save-dev@types/node@types/validator$npminstallsequelizereflect-metadatasequelize-typescript$npminstall--save-devts-node......