zoukankan      html  css  js  c++  java
  • 2020 CCPC Wannafly Winter Camp Day3.C. 无向图定向(k染色问题)

    题目链接

    题解思路:先说结论,最短的最长路=该无向图的最小染色数-1。其实这很好感觉出来,但具体证明请参照狄尔沃斯定理。至于如何求无向图的最小染色数,由于数据较小,可以直接状压dp或是dfs回溯求得。


    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> PII;
    #define ls l,mid,rt<<1
    #define rs mid+1,r,rt<<1|1
    #define endl '
    '
    const int MAXN = 10+10;
    const double EPS = 1e-12;
    const ll mod = 1e9+7;
    map<PII,bool>mp;
    
    int T,n,m,now,ans=1e9;
    vector<int>G[MAXN],col[MAXN];
    
    bool check(int u,int x){
        for(auto v:col[x]){
            if(mp[PII(v,u)])return 0;
        }
        return 1;
    }
    
    void dfs(int u,int sum){
        if(u==n+1){
            ans=min(ans,sum);
            return ;
        }
        if(sum>ans)return;
        for(int i=1;i<=sum+1;i++){
            if(i==sum+1){
                col[++now].push_back(u);
                dfs(u+1,sum+1);
                col[now].pop_back();now--;
            }
            else if(check(u,i)){
                col[i].push_back(u);
                dfs(u+1,sum);
                col[i].pop_back();
            }
        }
    }
    
    int main()
    {
        scanf("%d %d",&n,&m);
        int u,v;
        for(int i=1;i<=m;i++){
            scanf("%d %d",&u,&v);
            G[u].push_back(v);
            G[v].push_back(u);
            mp[PII(u,v)]=mp[PII(v,u)]=1;
        }
        dfs(1,0);
        cout<<ans-1<<endl;
    }
  • 相关阅读:
    常用的汇编指令与技巧
    汇编调用c函数为什么要设置栈
    lp2356
    String函数的总结
    2019-5-22训练
    STL——substr
    STL 反转函数 (reverse() )
    2019-5-15训练——深搜
    高精度加法
    八皇后题解
  • 原文地址:https://www.cnblogs.com/Mmasker/p/12642837.html
Copyright © 2011-2022 走看看