zoukankan      html  css  js  c++  java
  • Luogu P1330 封锁阳光大学 (黑白染色)

    题意:

    无向图,给一个顶点染色可以让他相邻的路不能通过,但是相邻顶点不能染色,求是否可以让所有的路不通,如果可以求最小染色数。

    思路:

    对于无向图中的每一个连通子图,都只有两种染色方法,或者染不了,直接搜即可,注意搜的姿势

    代码:

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #include<cstring>
    #include<string>
    #include<stack>
    #include<queue>
    #include<deque>
    #include<set>
    #include<vector>
    #include<map>
    #include<functional>
        
    #define fst first
    #define sc second
    #define pb push_back
    #define mem(a,b) memset(a,b,sizeof(a))
    #define lson l,mid,root<<1
    #define rson mid+1,r,root<<1|1
    #define lc root<<1
    #define rc root<<1|1
    #define lowbit(x) ((x)&(-x)) 
    
    using namespace std;
    
    typedef double db;
    typedef long double ldb;
    typedef long long ll;
    typedef unsigned long long ull;
    typedef pair<int,int> PI;    
    typedef pair<ll,ll> PLL;
    
    const db eps = 1e-6;
    const int mod = 1e9+7;
    const int maxn = 2e6+100;
    const int maxm = 2e6+100;
    const int inf = 0x3f3f3f3f;
    const db pi = acos(-1.0);
    vector<int>v[maxn];
    int vis[maxn];
    int c[maxn];
    int sum[2];
    bool dfs(int i, int cl){
        if(vis[i]==1){
            if(cl==c[i])return true;
            else return false;
        }
        vis[i] = 1;
        c[i] = cl;
        sum[cl]++;
        int sz = v[i].size();
        bool ans = true;
        for(int j = 0; j < sz; j++){
            ans = ans && dfs(v[i][j], cl^1);
        }
        return ans;
    }
    int main() {
        int n, m;
        scanf("%d %d", &n, &m);
        for(int i = 0; i < m; i++){
            int x, y;
            scanf("%d %d", &x, &y);
            v[x].pb(y);
            v[y].pb(x);
        }
        mem(vis, 0);
        int ans = 0;
        for(int i = 0; i < n; i++){
            if(vis[i]==1)continue;
            sum[0] = sum[1] = 0;
            if(!dfs(i, 0)){
                printf("Impossible");
                return 0;
            }
            ans += min(sum[0], sum[1]);
        }
        printf("%d", ans);
        return 0;
    }
    /*
    4
    2.
    2 4
    0 0 1 1
    2 4
    0 1 0 2
    2 3
    0 1 2
    2 4
    0 0 0 1
    */
  • 相关阅读:
    Oracle Instant Client(即时客户端) 安装与配置
    Windows 下 Toad 如何使用 Oracle instantclient 32位客户端
    Oracle 内存(SGA,PGA)详细介绍
    深入解析Oracle 10g中SGA_MAX_SIZE和SGA_TARGET参数的区别和作用
    Android中的Touch事件
    Activity源码简要分析总结
    Android中的Interpolator
    Android 触摸手势基础 官方文档概览
    Android中View的绘制过程 onMeasure方法简述 附有自定义View例子
    Android TextView走马灯效果
  • 原文地址:https://www.cnblogs.com/wrjlinkkkkkk/p/9520774.html
Copyright © 2011-2022 走看看