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 '\n'
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;
}

 

posted @ 2020-04-06 16:59  Mmasker  阅读(268)  评论(0编辑  收藏  举报