题意:链接:https://ac.nowcoder.com/acm/contest/4114/C
来源:牛客网
火山哥手里有一个 n个点 m条边的无向图。
现在,火山哥请你把无向图的每条边确定一个方向,使之成为一个DAG,并且最小化最长路的长度。
这里一条路径的长度指的是经过边的数量。
思路:根据狄尔沃斯定理,答案为最小染色数-1;
那么何为最小染色数呢:这里染色有一个规则,就是相邻的点不能染同样的颜色;
那么我们应该如何实际操作这个染色的过程呢。
有两种方法,一种是状压,一种是dfs
我们这里采用dfs
因为数据n<=17,所以我们直接暴力遍历也不会超时;
所以,我们暴力整个过程即可
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int n,m,t1,t2,color[20],cnt,g[20][20],ans=0x3f3f; 5 6 bool check(int p,int c) { 7 int flag = 1; 8 for(int i=1;i<=n;i++) { 9 if(g[p][i] && color[i]==c) { 10 flag = 0; 11 break; 12 } 13 } 14 return flag; 15 } 16 17 void dfs(int p) { 18 if(cnt>=ans) return; 19 if(p>n){ 20 ans=min(ans,cnt); 21 } 22 else for(int i=1;i<=cnt+1;i++) { 23 if(check(p,i)){ 24 color[p]=i; 25 if(i>cnt){ 26 ++cnt; 27 dfs(p+1); 28 --cnt; 29 } 30 else{ 31 dfs(p+1); 32 } 33 color[p]=0; 34 } 35 } 36 } 37 38 int main() 39 { 40 cin>>n>>m; 41 for(int i=1;i<=m;i++){ 42 cin>>t1>>t2; 43 g[t1][t2]=g[t2][t1]=1; 44 } 45 dfs(1); 46 cout<<ans-1<<endl; 47 }