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;
}
相关文章
使用递归函数处理上下级关系的数组
使用递归函数处理上下级关系的数组
45 0
|
6月前
【洛谷 P2089】烤鸡(循环枚举)
烤鸡问题探讨了如何组合10种配料达成特定美味程度。给定正整数$n$代表美味程度,程序需列出所有使得配料总和等于$n$的方案。样例输入11对应10种配料的不同组合,输出显示了10种符合条件的方案。代码通过暴力枚举实现,AC代码展示了如何遍历所有可能的配料质量组合来找到答案。对于100%的数据,$n\leq5000$。
64 0
|
7月前
|
算法 测试技术 C#
【分类讨论】【解析几何】【 数学】【推荐】1330. 翻转子数组得到最大的数组值
【分类讨论】【解析几何】【 数学】【推荐】1330. 翻转子数组得到最大的数组值
|
7月前
|
人工智能 测试技术
【位运算 状态压缩 枚举子集】1178. 猜字谜
【位运算 状态压缩 枚举子集】1178. 猜字谜
|
7月前
|
存储 算法 测试技术
位运算、状态压缩、枚举子集汇总
位运算、状态压缩、枚举子集汇总
|
7月前
两个整数做除法,有时会产生循环小数,其循环部分称为:循环节。 比如,11/13=6=>0.846153846153… 其循环节为[846153] 共有6位。
两个整数做除法,有时会产生循环小数,其循环部分称为:循环节。 比如,11/13=6=>0.846153846153… 其循环节为[846153] 共有6位。
|
7月前
|
存储 算法 Java
【算法训练-数组 二】【元素组合】两数之和、三数之和
【算法训练-数组 二】【元素组合】两数之和、三数之和
55 0
|
C语言
乘法口诀标的打印及解释
打印乘法口诀表可以说是c语言中一个很经典的一个简单程序了。 打印乘法口诀表的第一反应可能会是很难,怎么打印出这么多相乘的数呢。但是仔细想分析和考虑的话,其实很简单。那么我来说一下打印乘法口诀表的思路。
87 0
|
存储 算法
算法训练day11|20. 有效的括号;1047. 删除字符串中的所有相邻重复项;150. 逆波兰表达式求值
算法训练day11|20. 有效的括号;1047. 删除字符串中的所有相邻重复项;150. 逆波兰表达式求值