#include<bits/stdc++.h>
using namespace std;
const int N=3e5+10;
const int mod=998244353;
int t,n,m,last=1;
int ans,cnt;
int sum[N][2];
struct Node{
vector<int> next;
int color[2]={0,0};
}a[N];
bool flag=0,vis[N],f=0;
void dfs(int now){
vis[now]=1;
//cout<<"到达 "<<now<<endl;
if(a[now].color[f]!=0){
if(a[now].color[f]!=3-last){
flag=1;
return;
}
}
a[now].color[f]=3-last;
//cout<<"颜色为"<<a[now].color[f]<<endl;
last=3-last;
if(last%2==1) sum[cnt][f]++;
for(int i=0,len=a[now].next.size();i<len;i++){
if(!vis[i]&&i){
dfs(i);
}
else{
if(a[i].color[f]!=3-a[now].color[f]&&a[i].color[f]!=0){
flag=1;
return;
}
}
}
}
int kuaisu(int zs){
if(zs==0) return 1;
int x=2,res=1;
while(zs--){
if(zs%2){
res*=x;
res%=mod;
}
x=(x*x)%mod;
zs>>1;
}
return res%mod;
}
int main(){
cin>>t;
while(t--){
flag=0;
ans=0;
f=0;
cnt=0;
last=1;
memset(vis,0,sizeof(vis));;
for(int i=0;i<n;i++)
{
a[i].next.clear();
a[i].color[1]=a[i].color[0]=0;
}
scanf("%d%d",&n, &m);
int u,v;
for(int i=0;i<m;i++){
scanf("%d%d",&u, &v);
a[u].next.push_back(v);
a[v].next.push_back(u);
}
for(int i=1;i<=n;i++){
if(!vis[i]){
cnt++;
dfs(i);
}
}
if(flag){
printf("%d\n",0);
continue;
}
for(int i=0;i<cnt;i++)
{
ans+=(kuaisu(sum[i][0]));
ans%=mod;
}
memset(vis,0,sizeof(vis));
last=2;
f=1;
cnt=0;
for(int i=1;i<=n;i++){
if(!vis[i]){
cnt++;
dfs(i);
}
}
for(int i=0;i<cnt;i++)
{
ans+=(kuaisu(sum[i][1]));
ans%=mod;
}
printf("%d\n",ans);
}
return 0;
}
代码可能不好读,找了好久没找出错QAQ
就对了样例
放一组错误样例
输入:
6
8 7
2 3
3 4
4 5
5 2
6 7
7 8
8 6
1 0
2 1
1 2
3 3
1 2
2 3
1 3
3 2
2 3
3 1
4 4
1 2
2 3
3 4
4 1
样例输出:
0
3
4
0
6
8
跪求大佬救命