zoukankan      html  css  js  c++  java
  • Beautiful Graph CodeForces

    Beautiful Graph CodeForces - 1093D 二分图判定 简单组合

    题意

    给定一张(n)个点(m)条边的无向图,可以给每个点赋值(1,2,3)

    要求赋值以后每条边的两个端点权值和是奇数,问有多少种赋值方法,答案对(998244353)取模

    [1leq t leq 3 imes 10^5\ 1leq n leq 3 imes 10^5,0leq mleq3 imes 10^5 ]

    分析

    显然只有2不能和1或3组合才可以,于是可以发现把原图抽象成2分图,然后对两个分部统计个数即可。

    不同的连通块可以通过乘法原理算答案。每个连通块内一部可以填1也可以填3,也可以左边2或者右边2

    于是每一块的答案就是(2^p + 2^q)

    如果连通块不是二分图,那么无法做到

    代码

    vector<int> e[maxn];
    ll pow2[maxn];
    int col[maxn];
    int c1,c2;
    bool flag;
    
    void dfs(int u,int co){
    	col[u] = co;
    	if(!co) c1++;
    	else c2++;
    	for(auto v:e[u]){
    		if(col[v] < 0) dfs(v,co ^ 1);
    		else if(col[v] == co){
    			flag = false;
    			return;
    		} 
    	}
    }
    
    void solve(){
    	int n = readint();
    	int m = readint();
    	flag = true;
    	for(int i = 0;i <= n;i++) e[i].clear(),col[i] = -1;
    	for(int i = 0;i < m;i++){
    		int x = readint();
    		int y = readint();
    		e[x].pb(y);
    		e[y].pb(x);	
    	} 
    	ll ans = 1;
    	for(int i = 1;i <= n;i++){
    		if(col[i] == -1){
    			c1 = c2 = 0;
    			dfs(i,0);
    			if(!flag) {
    				ans = 0;
    				break;
    			}
    			ans *= pow2[c1] + pow2[c2];
    			ans %= MOD;
    		}
    	}
    	cout << ans << '
    ';
    }
    
    
    int main(){
    	int T = readint();
    	pow2[0] = 1ll;
    	for(int i = 1;i < maxn;i++)
    		pow2[i] = (pow2[i - 1] << 1) % MOD;
    	while(T--){
    		solve();
    	}
    }
    
  • 相关阅读:
    EXTJS 的PagingToolbar.js
    extjs之gridpanel完全操作(事件)
    Asp.net的服务器推技术 (Server Push) .NET
    Extjs 右下角弹出框 可弹出多个 冒泡小窗体
    Web IM技术简介
    iphone 开发图片显示圆角效果
    linux 修改IP, DNS 命令
    Mysql Data目录生成大量mysqlbin.****
    linux下查看内存使用情况
    rpm卸载mysql
  • 原文地址:https://www.cnblogs.com/hznumqf/p/14027106.html
Copyright © 2011-2022 走看看