C 无向图定向

题:https://ac.nowcoder.com/acm/contest/4114/C

题意:给定无向图定向,使之成为定向图同时使最长路最短

分析:狄尔沃斯定理。给n个点染色,要求最后图相邻点颜色不能相同,然后编号小的向编号的大走,那么最长路就是颜色种类-1,用dfs求出最小染色数

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define pb push_back
#define MP make_pair
#define pil pair<int,ll>
const int inf=0x3f3f3f3f;
const ll INF=1e18;
const int M=20;
vector<int>g[M];
int col[M],ans,m,n;
bool check(int u,int i){
    for(auto v:g[u])
        if(col[v]==i)
            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(!check(u,i))
            continue;
        col[u]=i;
        if(i==sum+1){
            dfs(u+1,sum+1);
        }
        else dfs(u+1,sum);
        col[u]=0;
    }
}
int main(){
    scanf("%d%d",&n,&m);
    ans=n;
    for(int u,v,i=1;i<=m;i++){
        scanf("%d%d",&u,&v);
        g[u].pb(v);
        g[v].pb(u);
    }
    dfs(1,0);
    printf("%d",ans-1);
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/starve/p/13613242.html