D - Beautiful Graph

CodeForces - 1093D

You are given an undirected unweighted graph consisting of nn vertices and mm edges.

You have to write a number on each vertex of the graph. Each number should be 11, 22or 33. The graph becomes beautiful if for each edge the sum of numbers on vertices connected by this edge is odd.

Calculate the number of possible ways to write numbers 11, 22 and 33 on vertices so the graph becomes beautiful. Since this number may be large, print it modulo 998244353998244353.

Note that you have to write exactly one number on each vertex.

The graph does not have any self-loops or multiple edges.

Input

The first line contains one integer tt (1≤t≤3⋅1051≤t≤3⋅105) — the number of tests in the input.

The first line of each test contains two integers nn and mm (1≤n≤3⋅105,0≤m≤3⋅1051≤n≤3⋅105,0≤m≤3⋅105) — the number of vertices and the number of edges, respectively. Next mm lines describe edges: ii-th line contains two integers uiui, vivi (1≤ui,vi≤n;ui≠vi1≤ui,vi≤n;ui≠vi) — indices of vertices connected by ii-th edge.

It is guaranteed that ∑i=1tn≤3⋅105∑i=1tn≤3⋅105 and ∑i=1tm≤3⋅105∑i=1tm≤3⋅105.

Output

For each test print one line, containing one integer — the number of possible ways to write numbers 11, 22, 33 on the vertices of given graph so it becomes beautiful. Since answers may be large, print them modulo 998244353998244353.

Example

Input

2
2 1
1 2
4 6
1 2
1 3
1 4
2 3
2 4
3 4

Output

4
0

Note

Possible ways to distribute numbers in the first test:

  1. the vertex 11 should contain 11, and 22 should contain 22;
  2. the vertex 11 should contain 33, and 22 should contain 22;
  3. the vertex 11 should contain 22, and 22 should contain 11;
  4. the vertex 11 should contain 22, and 22 should contain 33.

In the second test there is no way to distribute numbers.

题意:

给你n个节点,m个边的无向图。

每人一个节点可以填1,2,3 中的任意一个。

问你有多少种填数字的方案,使每一条边连接的两个节点填的数字相加为奇数。

思路:

因为一个奇数+一个偶数=奇数。

所以如果有合法的填充方案就是有合法的黑白染色方案。

那么我们先用经典的“黑白染色-判断法”判断是否能有合法方案。

如果没有直接输出0

如果可以成功黑白染色,再计算方案数。

我们通过可以推出

每一个连通块中的方案数是 2(填奇数的节点个数)+2(填偶数的节点个数)

填奇数的节点个数和偶数的个数可以通过dfs得出。

如果一个连通块中只有一个节点,那么方案数应该是3.

每一个联通的答案的乘积就是总方案数。

记得取模即可。

细节见代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define sz(a) int(a.size())
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define chu(x) cout<<"["<<#x<<" "<<(x)<<"]"<<endl
#define du3(a,b,c) scanf("%d %d %d",&(a),&(b),&(c))
#define du2(a,b) scanf("%d %d",&(a),&(b))
#define du1(a) scanf("%d",&(a));
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;}
ll lcm(ll a, ll b) {return a / gcd(a, b) * b;}
ll powmod(ll a, ll b, ll MOD) {a %= MOD; if (a == 0ll) {return 0ll;} ll ans = 1; while (b) {if (b & 1) {ans = ans * a % MOD;} a = a * a % MOD; b >>= 1;} return ans;}
void Pv(const vector<int> &V) {int Len = sz(V); for (int i = 0; i < Len; ++i) {printf("%d", V[i] ); if (i != Len - 1) {printf(" ");} else {printf("\n");}}}
void Pvl(const vector<ll> &V) {int Len = sz(V); for (int i = 0; i < Len; ++i) {printf("%lld", V[i] ); if (i != Len - 1) {printf(" ");} else {printf("\n");}}} inline void getInt(int *p);
const int maxn = 300010;
const int inf = 0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
int t;
std::vector<int> e[maxn];
queue<pii> q;
int col[maxn];
const ll mod = 998244353;
ll ans = 0ll;
int vis[maxn];
int tot;
ll base1;
ll base2;
void dfs(int x, int c)
{
vis[x] = 1;
tot++;
if (c & 1) {
base1++;
} else {
base2++;
}
for (auto z : e[x]) {
if (vis[z]) { continue; }
dfs(z, c == 1 ? 2 : 1);
}
}
int main()
{
//freopen("D:\\code\\text\\input.txt","r",stdin);
//freopen("D:\\code\\text\\output.txt","w",stdout);
du1(t);
while (t--) {
int n, m;
du2(n, m);
if (n == 1) {
n = 1;
}
repd(i, 1, n) {
e[i].clear();
col[i] = 0;
vis[i] = 0;
}
while (!q.empty()) {
q.pop();
}
int x, y;
repd(i, 1, m) {
du2(x, y);
e[x].pb(y);
e[y].pb(x);
}
int isok = 1;
// 二分图判断部分
repd(i, 1, n) {
if (col[i] != 0) {
continue;
}
q.push(mp(i, 1));
while (!q.empty()) {
pii temp = q.front();
// cout<<temp.fi<<" "<<temp.second<<endl;
q.pop();
if (col[temp.fi] != 0 && col[temp.fi] != temp.se) {
isok = 0;
break;
}
if (col[temp.fi] == 0) {
col[temp.fi] = temp.se;
} else {
continue;
}
for (auto Z : e[temp.fi]) {
q.push(mp(Z, temp.se == 1 ? 2 : 1));
}
}
}
if (isok) {
ans = 1ll;
repd(i, 1, n) {
// 对于每一个连通块,求方案数。乘法原理计算答案。
if (vis[i]) { continue; }
tot = 0;
base1 = 0ll;
base2 = 0ll;
dfs(i, 1);
if (tot == 1) {// 连通块内只有一个节点时 答案是3
ans = ans * 3ll % mod;
} else {
ans = ans * ((powmod(2ll, base1, mod) % mod + powmod(2ll, base2, mod) % mod) % mod) % mod;
}
}
printf("%lld\n", ans );
} else {
printf("0\n");
}
// cout << isok << endl;
}
return 0;
} inline void getInt(int *p)
{
char ch;
do {
ch = getchar();
} while (ch == ' ' || ch == '\n');
if (ch == '-') {
*p = -(getchar() - '0');
while ((ch = getchar()) >= '0' && ch <= '9') {
*p = *p * 10 - ch + '0';
}
} else {
*p = ch - '0';
while ((ch = getchar()) >= '0' && ch <= '9') {
*p = *p * 10 + ch - '0';
}
}
}

D - Beautiful Graph CodeForces - 1093D (二分图染色+方案数)的更多相关文章

  1. Edge coloring of bipartite graph CodeForces - 600F (二分图染色)

    大意:给定二分图, 求将边染色, 使得任意邻接边不同色且使用颜色种类数最少 最少颜色数即为最大度数, 要输出方案的话, 对于每一条边(u,v), 求出u,v能使用的最小的颜色$t0$,$t1$ 若t0 ...

  2. CodeForces - 1093D:Beautiful Graph(二分图判定+方案数)

    题意:给定无向图,让你给点加权(1,2,3),使得每条边是两端点点权和维奇数. 思路:一个连通块是个二分图,判定二分图可以dfs,并查集,2-sat染色. 这里用的并查集(还可以带权并查集优化一下,或 ...

  3. Codeforces 57C (1-n递增方案数,组合数取模,lucas)

    这个题相当于求从1-n的递增方案数,为C(2*n-1,n); 取模要用lucas定理,附上代码: #include<bits/stdc++.h> using namespace std; ...

  4. AIM Tech Round (Div. 2) C. Graph and String 二分图染色

    C. Graph and String 题目连接: http://codeforces.com/contest/624/problem/C Description One day student Va ...

  5. Codeforces 1093D Beautiful Graph(二分图染色+计数)

    题目链接:Beautiful Graph 题意:给定一张无向无权图,每个顶点可以赋值1,2,3,现要求相邻节点一奇一偶,求符合要求的图的个数. 题解:由于一奇一偶,需二分图判定,染色.判定失败,直接输 ...

  6. Codeforces 1093D. Beautiful Graph【二分图染色】+【组合数】

    <题目链接> 题目大意: 给你一个无向图(该无向图无自环,且无重边),现在要你给这个无向图的点加权,所加权值可以是1,2,3.给这些点加权之后,要使得任意边的两个端点权值之和为奇数,问总共 ...

  7. Educational Codeforces Round 56 (Rated for Div. 2) D. Beautiful Graph (二分图染色)

    题意:有\(n\)个点,\(m\)条边的无向图,可以给每个点赋点权\({1,2,3}\),使得每个点连的奇偶不同,问有多少种方案,答案对\(998244353\)取模. 题解:要使得每个点所连的奇偶不 ...

  8. Codeforces 664D Graph Coloring 二分图染色

    题意: 一个无向图的每条边为红色或蓝色,有这样一种操作:每次选一个点,使与其相邻的所有边的颜色翻转. 求解是否可以经过一系列操作使所有的边颜色相同,并输出最少操作次数和相应的点. 分析: 每个点要么选 ...

  9. Codeforces Round #550 (Div. 3) F. Graph Without Long Directed Paths (二分图染色)

    题意:有\(n\)个点和\(m\)条无向边,现在让你给你这\(m\)条边赋方向,但是要满足任意一条边的路径都不能大于\(1\),问是否有满足条件的构造方向,如果有,输出一个二进制串,表示所给的边的方向 ...

随机推荐

  1. 20190603 - CentOS 7 提示 Failed to load SELinux policy. Freezing 导致卡住不启动的解决办法

    现象 最近 Windows 和两台 Mac 混用,将 Windows VirtualBox 中安装的 CentOS 7 拷贝到 Mac 上. 启动 CentOS 7 时,图形界面进度卡在最后,按 Es ...

  2. Postman的安装和升级

    安装postman Postman本地应用程序 Postman可以作为Mac,Windows和Linux操作系统的本地应用程序. 要安装Postman,请转到应用界面,并根据你的平台点击Mac/Win ...

  3. Mac 配置flutter

    1. vim ~/.base_profile 2. 如下 export PATH=/Users/korea/Desktop/development/flutter/bin:$PATH export P ...

  4. VMware Workstation 12许可证

    VMware 12专业版永久许可证密钥: 5A02H-AU243-TZJ49-GTC7K-3C61N VF5XA-FNDDJ-085GZ-4NXZ9-N20E6 UC5MR-8NE16-H81WY-R ...

  5. 解决windows server 2019远程桌面许可证问题

    解决远程桌面许可证问题,你的远程桌面许可证出现问题,你的会话将在60分钟后断开. 最近装了台windows server 2019服务器做远程桌面连接,也安装了远程桌面许可证,但客户端远程连接时出现你 ...

  6. 【VS开发】CListBox智能滚动设置

    添加数据以后,再在下面加句, int nCount = m_myListBox.GetCount(); if (nCount > 0) m_myListBox.SetCurSel(nCount ...

  7. Oracle数据库弱口令解密

    1.首先我们先看下Oracle加密的格式. 接下来我们把他头和尾部删除,中间加: 通过py脚本来进行完成 转换完成后输出成这种格式 之后直接丢进kali里面,用john --w=字典文件 + 转换文件 ...

  8. Oracle-DQL 6- 子查询

    子查询: --查询emp表中工资高于allen的员工信息SELECT sal FROM empWHERE ename = 'ALLEN'; SELECT * FROM empWHERE sal > ...

  9. spring-boot 使用 jackson 出错(五)

    环境 jdk 6 tomcat 6.0.53 sts 4.4.2 maven 3.2.5 原因 spring boot 1.5.22.RELEASE 默认使用的 jackson 的版本是 2.8.x, ...

  10. Nginx的一些常用配置

    #定义Nginx运行的用户和用户组 #user nobody; #nginx进程数,建议设置为等于CPU总核心数. worker_processes 1; #全局错误日志定义类型,[ debug | ...