生活随笔
收集整理的這篇文章主要介紹了
Codeforces 1093D Beautiful Graph
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:http://codeforces.com/contest/1093/problem/D
第一次做這種題目,染色+組合數學。。
假設這個圖里有奇數環,那么肯定是不行的,因為無論怎么樣都是偶數。
如果沒有奇數環。那么對于任意一個連通分支,一條邊所連得兩個點,肯定有一個是2,另外的是1或者3。如果將每條邊連接的兩個點染成黑點和白點。個數分別為wi和vi,如果黑點是2,那么個數就是2vi。如果白點是2,那么個數是2wi。那么這個連通分支的就是這兩個數的和,整個圖的就是各個連通分支的數的乘積。。
由于這是多組輸入,vector要清零。
不要用memset,對數組都做了一個遍,會TLE。
代碼如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#include<cmath>
#define ll long long
#define mod 998244353
using namespace std;const int maxx=3e5+10;
vector<int >p[maxx];
int color[maxx];
int cnt1=0;
int cnt0=0;
int n,m;
int flag;ll qsm(ll a,ll b)//快速冪
{ll ans=1;while(b){if(b%2) ans=(ans*a)%mod;b/=2;a=(a*a)%mod;}return ans;
}void init()
{for(int i=0;i<=n;i++) p[i].clear();for(int i=0;i<=n;i++) color[i]=0;
}void dfs(int x,int c)
{if(c==1) cnt1++;if(c==2) cnt0++;color[x]=c;for(int i=0;i<p[x].size();i++){if(color[p[x][i]]==0) dfs(p[x][i],3-c);//3-c,如果是1,那么就變成了2,如果是2,就變成了1。如果是3,那么就變成了0,那樣的話,就相當于沒有遍歷,以后偶還是會遍歷到的。。else if(color[p[x][i]]==c)//有奇數環{flag=0;return ;}}
}int main()
{int t;scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);init();for(int i=0;i<m;i++){int a,b;scanf("%d%d",&a,&b);p[a].push_back(b);p[b].push_back(a);}flag=1;ll ans=1;for(int i=1;i<=n;i++){if(color[i]==0){cnt1=0;cnt0=0;dfs(i,1);if(!flag) break;ans=(ans*(qsm(2,cnt1)%mod+qsm(2,cnt0)%mod)%mod)%mod;}}if(!flag) printf("0\n");else printf("%I64d\n",ans%mod);}
}
努力加油a啊,(o)/~
總結
以上是生活随笔為你收集整理的Codeforces 1093D Beautiful Graph的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。