• 训练指南 UVALive



    layout: post
    title: 训练指南 UVALive - 3523 (双联通分量 + 二分图染色)
    author: "luowentaoaa"
    catalog: true
    mathjax: true
    tags:
    - 双联通分量
    - 二分图染色
    - 图论
    - 训练指南

    Knights of the Round Table

    UVALive - 3523

    题意

    圆桌骑士。有的骑士之间是相互憎恨的,不能连坐,需要安排奇数个骑士围着桌子坐着,大于3个,求哪些骑士不可能安排到座位。

    根据给定的关系,如果两个骑士之间没有憎恨关系,那么连边。最终就是求有多少个点无法位于奇圈之内。根据二分图可以知道二分图的都是偶数圈;所以只要先把联通分量求出来然后判断是否是二分图就行

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const ll mod=998244353;
    const int maxn=1e3+50;
    const ll inf=0x3f3f3f3f3f3f3f3fLL;
    
    bool A[maxn][maxn];
    struct Edge{
        int u,v;
    };
    ///割顶 bccno 无意义
    int pre[maxn],iscut[maxn],bccno[maxn],dfs_clock,bcc_cut;
    vector<int>G[maxn],bcc[maxn];
    stack<Edge>S;
    int dfs(int u,int fa){
        int lowu = pre[u] = ++dfs_clock;
        int child = 0;
        for(int i = 0; i < G[u].size(); i++){
            int v =G[u][i];
            Edge e = (Edge){u,v};
            if(!pre[v]){ ///没有访问过
                S.push(e);
                child++;
                int lowv = dfs(v, u);
                lowu=min(lowu, lowv);                ///用后代更新
                if(lowv >= pre[u]){
                    iscut[u]=true;
                    bcc_cut++;bcc[bcc_cut].clear();   ///注意 bcc从1开始
                    for(;;){
                        Edge x=S.top();S.pop();
                        if(bccno[x.u] != bcc_cut){bcc[bcc_cut].push_back(x.u);bccno[x.u]=bcc_cut;}
                        if(bccno[x.v] != bcc_cut){bcc[bcc_cut].push_back(x.v);bccno[x.v]=bcc_cut;}
                        if(x.u==u&&x.v==v)break;
                    }
                }
            }
            else if(pre[v] < pre[u] && v !=fa){
                S.push(e);
                lowu = min(lowu,pre[v]);
            }
        }
        if(fa < 0 && child == 1) iscut[u] = 0;
        return lowu;
    }
    void find_bcc(int n){
        memset(pre, 0, sizeof(pre));
        memset(iscut, 0, sizeof(iscut));
        memset(bccno, 0, sizeof(bccno));
        dfs_clock = bcc_cut = 0;
        for(int i = 0; i < n;i++)
            if(!pre[i])dfs(i,-1);
    }
    
    int odd[maxn], color[maxn];
    bool bipartite(int u,int b){
        for(int i = 0;i < G[u].size(); i++){
            int v =G[u][i]; if(bccno[v] != b) continue;
            if(color[v] == color[u])return false;
            if(!color[v]){
                color[v] = 3 - color[u];
                if(!bipartite(v,b))return false;
            }
        }
        return true;
    }
    int main()
    {
        std::ios::sync_with_stdio(false);
        std::cin.tie(0);
        std::cout.tie(0);
        int kase=0,n,m;
        while(cin>>n>>m&&n){
            for(int i=0;i<n;i++) G[i].clear();
    
            memset(A,0,sizeof(A));
            for(int i=0;i<m;i++){
                int u,v;
                cin>>u>>v;
                u--;v--;
                A[u][v]=A[v][u]=1;
            }
            for(int u=0;u<n;u++){
                for(int v=u+1;v<n;v++){
                    if(!A[u][v]){
                        G[u].push_back(v);
                        G[v].push_back(u);
                    }
                }
            }
    
            find_bcc(n);
    
            memset(odd, 0, sizeof(odd));
            for(int i = 1; i <= bcc_cut; i++){
                memset(color, 0, sizeof(color));
                for(int j = 0;j < bcc[i].size(); j++) bccno[bcc[i][j]]=i;
    
                int u=bcc[i][0];
                color[u]=1;
                if(!bipartite(u,i))
                    for(int j = 0;j < bcc[i].size(); j++)odd[bcc[i][j]]=1;
            }
            int ans=n;
            for(int i = 0; i < n; i++)if(odd[i])ans--;
            cout<<ans<<endl;
    
        }
        return 0;
    }
    
  • 相关阅读:
    NIO与普通IO文件读写性能对比
    JAVA学习.java.sql.date 与java.util.date以及gettime()方法的分析
    软件工程之软件设计
    ubuntu下管理android手机
    AFNetworking2.0 NSHipster翻译
    【Jsoup爬取网页内容】
    IOS 表视图UITableView 束NSBundle
    如何将位图格式图片文件(.bmp)生成geotiff格式图片?
    opencv3 使用glob遍历并修改文件名
    Ubuntu clion下载及激活
  • 原文地址:https://www.cnblogs.com/luowentao/p/10340351.html
Copyright © 2020-2023  润新知