无向图定向

题意:链接: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 }

猜你喜欢

转载自www.cnblogs.com/pangbi/p/12456026.html
今日推荐