CF1093D
dfs搜索 所有的点
注意:
1.图可能不连通 最后结果是每个联通分量的乘积
2.每次都要初始化,少用memset 可能TL
3. 因为每个点权值为1.2.3 其中之一,每次结果为(2^(偶数个数) )+(2 ^(奇数点个数))
4. 经典的染色问题。
#include<queue>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<math.h>
#include<stack>
#include<stdio.h>
#include<vector>
#include<map>
#include<string.h>
#define ll long long
#define ld long double
#define F(n) for(int i=1;i<=n;i++)
using namespace std;
const int mx=3e5+10,inf=1e9+10,mod=998244353;
const ll maxn=1e18;
int n,m;
bool flag=0;
int cnt[2];
bool book[mx],num[mx];
int head[mx],tot=1;
struct edge{
int to,next;
}e[mx<<1];
void add(int from,int to){
e[tot].to=to;
e[tot].next=head[from];
head[from]=tot++;
}
ll dfs(int u){
for(int i=head[u];i;i=e[i].next){
int to=e[i].to;
if(!book[to]){
num[to]=!num[u];
cnt[num[to]]++;
book[to]=1;
dfs(to);
}else{
if(num[to]==num[u])
flag=1;
}
}
}
ll pow2(int x){
ll base=2,ans=1;
while(x){
if(x&1)ans=(ans*base)%mod;
base=(base*base)%mod;
x>>=1;
}
return ans;
}
int main()
{
int T,u,v;
ll ans=0;
cin>>T;
while(T--){
scanf("%d%d",&n,&m);
ans=1,tot=1,flag=0;;
for(int i=0;i<=n;i++){
book[i]=0;
num[i]=0;
head[i]=0;
}
F(m){
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
for(int i=1;i<=n;i++){
if(flag){
ans=0;
break;
}
cnt[0]=0;
cnt[1]=1;
if(!book[i]){
num[i]=book[i]=1;
dfs(i);
ans=(ans*(pow2(cnt[0])+pow2(cnt[1])))%mod;
}
}
printf("%lld\n",ans);
}
return 0;
}