poj 1129 Channel Allocation(四色定理)

 1 #include<iostream>

 2 #include<cstdio>

 3 #include<cstdlib>

 4 #include<cstring>

 5 #include<string>

 6 #include<queue>

 7 #include<algorithm>

 8 #include<map>

 9 #include<iomanip>

10 #include<climits>

11 #include<string.h>

12 #include<numeric>

13 #include<cmath>

14 #include<stdlib.h>

15 #include<vector>

16 #include<stack>

17 #include<set>

18 #define FOR(x, b, e)  for(int x=b;x<=(e);x++)

19 #define REP(x, n)     for(int x=0;x<(n);x++)

20 #define INF 1e7

21 #define MAXN 100010

22 #define maxn 1000010

23 #define Mod 1000007

24 #define N 33

25 using namespace std;

26 typedef long long LL;

27 

28 

29 int G[N][N];

30 int col[N];

31 int n, cnt;

32 bool d[N];

33 

34 int main()

35 {

36     string tmp;

37     while (cin >> n, n) {

38         memset(G, 0, sizeof(G));

39         memset(col, 0, sizeof(col));

40         for (int k = 0; k < n; ++k) {

41             cin >> tmp;

42             for (int i = 0; tmp[i + 2]; ++i)

43                 G[tmp[0] - 'A' + 1][tmp[i + 2] - 'A' + 1] = 1;

44         }

45 

46         cnt = 0;

47         int i, j;

48         for (i = 1; i <= n; ++i) {

49             memset(d,0,sizeof(d));

50             for (j = 1; j <= i; ++j)        //寻找有冲突的频道编号 

51                 if (G[i][j]) d[col[j]] = 1;    //d[k]==1表示k频道有冲突 

52             for (j = 1;; j++)                //寻找可以使用的编号最小的频道 

53                 if (d[j] == 0) break;

54             col[i] = j;

55             cnt = max(cnt, j);

56         }

57         if (cnt == 1)

58             printf("%d channel needed.\n",cnt);

59         else 

60             printf("%d channels needed.\n", cnt);

61     }

62     return 0;

63 }
View Code
 1 < / pre><pre name = "code" class = "cpp">#include "stdio.h"

 2 #include "string.h"

 3 #include "algorithm"

 4 using namespace std;

 5 int map[26][26];

 6 int used[26];

 7 char ch[30];

 8 int n;

 9 /* 这个dfs是基于四色定理,所以dfs第一层循环i最大为4 

10    这种写法可以运作在四色定理的题目里,无向图任意的相邻两点颜色不同 

11 

12    */

13 void dfs(int node){

14     int flag, i, j;

15     if (node == n)

16         return;

17     for (i = 1; i <= 4; i++){

18         flag = 0;

19         //如果新结点与相邻结点颜色相同 则需要加颜色了,即i加1 

20         for (j = 0; j<n; j++){

21             if (map[node][j] && used[j] == i){

22                 flag = 1;

23                 break;

24             }

25         }

26         //这个if意思是如果新结点与相邻结点颜色都不相同,那么就染旧颜色,再搜索下一个结点 

27         if (!flag){

28             used[node] = i;

29             dfs(node + 1);

30             break;

31         }

32     }

33 }

34 

35 int main(){

36     int i, j;

37     while (scanf("%d", &n), n){

38         memset(map, 0, sizeof(map));

39         memset(used, 0, sizeof(used));

40         for (i = 0; i < n; i++){

41             scanf("%s", ch);

42             for (j = 2; j < strlen(ch); j++)

43             {

44                 map[i][ch[j] - 'A'] = 1;

45                 map[ch[j] - 'A'][i] = 1;

46             }

47         }

48         dfs(0);

49         sort(used, used + 26);

50         if (used[25] == 1)

51             printf("1 channel needed.\n");

52         else

53             printf("%d channels needed.\n", used[25]);

54     }

55 }
DFS

 

你可能感兴趣的:(location)