​题目大意:

在给定的一个图中(可能不连通)

给每个点赋值1、2、3 使得一条边上的两个端点点权相加为奇数

求方案数

一条满足条件的路径上的点权必为一奇一偶交替

偶数只有2 奇数有1、3

若位于1、3、5、.... 的点有x1个 位于2、4、6、... 的点有x0个

那么一条路径的方案数为 2^x1+2^x0 (x1的点作为奇数点的方案+x0的点作为奇数点的方案)

当图不连通 存在多个子图 那么每个子图的方案数相乘 就是总的方案数

当图中存在环时 若环上的点数为偶数则同样满足上式 但为奇数则整条路径不可能有解

#include <bits/stdc++.h>
#define LL long long
#define mod 998244353
using namespace std;
int n,m;
const int N=3e5+;
vector <int> e[N];
bool vis[N], NO;
int col[N], m0, m1;
LL p[N];
void init() {
p[]=1LL;
for(int i=;i<N;i++)
p[i]=p[i-]*2LL%mod;
}
void dfs(int u,int c) {
if(NO) return;
col[u]=c;
if(col[u]) m1++;
else m0++;
for(int i=;i<e[u].size();i++) {
int v=e[u][i];
if(col[v]==-) dfs(v,c^);
else if(col[v]==col[u]) {
NO=; return; // 环上的点数为奇数个
}
}
}
int main()
{
init();
int t; scanf("%d",&t);
while(t--) {
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
e[i].clear(), col[i]=-;
for(int i=;i<m;i++) {
int u,v; scanf("%d%d",&u,&v);
e[u].push_back(v), e[v].push_back(u);
}
LL ans=1LL; NO=;
for(int i=;i<=n;i++)
if(col[i]==-) {
m0=m1=; dfs(i,);
if(NO) break;
ans=(p[m0]+p[m1])%mod*ans%mod;
}
if(NO) printf("0\n");
else printf("%I64d\n",ans);
} return ;
}

最新文章

  1. 如何基于Azure平台实现MySQL HA(方法论篇)
  2. shell中创建mysql库和执行sql脚本
  3. Surprise团队第一周项目总结
  4. iOS开发 multipart 上传多张图片
  5. easyui textarea IE8中无法换行
  6. 使用ES6进行开发的思考
  7. sql server 字符串替换函数REPLACE
  8. hadoop编译
  9. 个人作业2—英语学习APP案例分析
  10. C#设计模式之二简单工厂模式(过渡模式)
  11. g4e基础篇#2 Git分布式版本控制系统的优势
  12. margin-top塌陷
  13. matplotlib读取csv文件
  14. OSGI嵌入jetty应用服务器
  15. vue mand-mobile ui Stepper步进器默认值传字符串进去不起作用
  16. node 创建server 及加载静态页面
  17. PyTorch(二)Intermediate
  18. spring-dao.xml配置问题(一)
  19. OpenOCD 0.9.0 release
  20. jenkins + sonar 安装配置

热门文章

  1. CSRF如何防御
  2. python基础【第九篇】
  3. 深入Linux内核架构 - 内核之中数据结构之间的关系图 &amp; 设备驱动程序(转)
  4. dns轮训python
  5. OpenGL学习——绘制第一个三角形
  6. eclipse中server location为灰色,不能修改
  7. react 的生命周期函数
  8. 71 Serializable(序列化和反序列化)
  9. 骚操作:c++如何用goto便捷地写人工栈?
  10. PHP ftp_nb_continue() 函数