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; }