4415. 点的赋值(二分图)

简介: 笔记

题目


2.png


输入输出


3.png

数据范围


2ce4cb84ecdc43d9a2aa5da5b3b28959.png

样例


输入样例:

2

2 1

1 2

4 6

1 2

1 3

1 4

2 3

2 4

3 4

输出样例:

4

0

题解


5.png

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 300010, M = N << 1;
const int mod = 998244353;
int n, m;
int h[N], e[M], ne[M], idx;
int color[N];
void add(int a, int b)  // 添加一条边a->b
{
    e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}
int s1 = 0, s2 = 0;
bool dfs(int u, int c) {
    color[u] = c;
    if(c == 1) s1 ++;
    else s2 ++;
    for (int i = h[u]; ~i; i = ne[i]) {
        int j = e[i];
        if(color[j] && color[j] == c) return false;
        if(!color[j] && !dfs(j, 3 - c)) return false;
    }
    return true;
}
int pow2(int k) {
    int x = 1;
    while(k--) x = x * 2 % mod;
    return x;
}
int main()
{
    ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    int t;  cin >> t;
    while (t--) {
        cin >> n >> m;
        memset(h, -1, (n + 1) * 4);
        memset(color, 0, (n + 1) * 4);
        idx = 0;
        int res = 1;
        while (m -- ) {
            int a, b; cin >> a >> b;
            add(a, b), add(b, a);
        }
        for (int i = 1; i <= n; i++) {
            if(!color[i]) { // 对每一个连通块处理
                s1 = s2 = 0;
                if(!dfs(i, 1)) {
                    res = 0;
                    break;
                }
                res = res * (long long)(pow2(s1) + pow2(s2)) % mod;
            }
        }
        cout << res << endl;
    }
    return 0;
}
相关文章
使用递归函数处理上下级关系的数组
使用递归函数处理上下级关系的数组
41 0
|
6月前
|
算法 测试技术 C#
【分类讨论】【解析几何】【 数学】【推荐】1330. 翻转子数组得到最大的数组值
【分类讨论】【解析几何】【 数学】【推荐】1330. 翻转子数组得到最大的数组值
|
C语言
二维数组实验题:按如下公式递归计算矩阵行列式的值:(C语言)
二维数组实验题:按如下公式递归计算矩阵行列式的值:(C语言)
223 1
二维数组实验题:按如下公式递归计算矩阵行列式的值:(C语言)
|
6月前
|
存储 算法 Java
【算法训练-数组 二】【元素组合】两数之和、三数之和
【算法训练-数组 二】【元素组合】两数之和、三数之和
52 0
|
C语言
乘法口诀标的打印及解释
打印乘法口诀表可以说是c语言中一个很经典的一个简单程序了。 打印乘法口诀表的第一反应可能会是很难,怎么打印出这么多相乘的数呢。但是仔细想分析和考虑的话,其实很简单。那么我来说一下打印乘法口诀表的思路。
70 0
|
测试技术 编译器 C语言
二维数组之查找鞍点的有无
二维数组之查找鞍点的有无
79 0
四元数的定义与性质
四元数的定义与性质
401 0
四元数的定义与性质
|
机器学习/深度学习 存储 算法
判断二分图
给定一个无向图graph,当这个图为二分图时返回true。 如果我们能将一个图的节点集合分割成两个独立的子集A和B,并使图中的每一条边的两个节点一个来自A集合,一个来自B集合,我们就将这个图称为二分图。 graph将会以邻接表方式给出,graph[i]表示图中与节点i相连的所有节点。每个节点都是一个在0到graph.length-1之间的整数。这图中没有自环和平行边: graph[i] 中不存在i,并且graph[i]中没有重复的值。
107 0