2015.11.14 ---2015.合肥

本文介绍了一个关于古农场布局的问题:如何在新规划的农场中放置尽可能多的古代农场,使得这些农场之间不会相邻,从而避免羊群之间的冲突。通过深度优先搜索算法与最大团算法求解最优解。

Bus Routes

 

Advanced Calculator

 

Autopilot System

 

Immortality of Frog

 

Land of Farms

给出 n*m的矩形,数字 0--9表示 古代的农场,古代农场里的羊不打架,

(这里练的时候,没有理解对题意,样例都推不出来,,练习的时候,以为是,古代的羊都不打架,所以古代农场都可以相邻,但是实际是,只能是联通块里面的羊不打架)

如果选择了古代农场,整个联通的这块古代农场都要被选

"."表示空地

现在需要新修农场,农场与农场之间不能相邻

问最多能够得到多少个农场

先将不冲突的农场之间连边,然后求出最大团,最大团里面的农场就满足两两之间都不冲突,而且数目是最多的

具体建图是

先初始化 100*100的图的矩阵

先给每个点编号,每个古代农场的联通块编号

然后编好号之后,扫一遍每一个点的上下左右四个方向,如果编号不同,就把这条边否决掉

然后跑最大团

另外比如样例

原图

. . 3 .

023 .

.2 1 1

编号矩阵是

1 2 3 4

5 6 3 7

8 6 9 9

像 3 和 3之间的边置为0,置为 1都可以(因为相当于是连向自己的边)

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<iostream>
  4 #include<algorithm>
  5 #include<vector>
  6 using namespace std;
  7 
  8 const int maxn = 105;
  9 char G[maxn][maxn];
 10 int g[maxn][maxn];//tu
 11 int p[maxn][maxn];//tu de bian hao
 12 int n,m;
 13 int vis[maxn][maxn];
 14 int dx[4] = {1,-1,0,0};
 15 int dy[4] = {0,0,1,-1};
 16 int Clique[maxn],New[maxn][maxn];
 17 int ans,N;
 18 int used[maxn];
 19 
 20 int number(char c){
 21     return c >= '0' && c <= '9';
 22 }
 23 
 24 int DFS(int T, int cnt)
 25 {
 26     if(T == 0)
 27     {
 28         if(ans < cnt)
 29         {
 30             ans = cnt;
 31             return 1;
 32         }
 33         return 0;
 34     }
 35     for(int i = 0; i < T; i++)
 36     {
 37         if(T - i + cnt <= ans) return 0;
 38         int u = New[cnt][i];
 39         if(Clique[u] + cnt <= ans) return 0;
 40         int num = 0;
 41         for(int j = i+1; j < T; j++)
 42             if(g[u][New[cnt][j]] == 1)
 43                 New[cnt+1][num++] = New[cnt][j];
 44         used[cnt+1] = u;
 45         if(DFS(num, cnt+1)) return 1;
 46     }
 47     return 0;
 48 }
 49 int MaxClique()
 50 {
 51     memset(Clique, 0, sizeof(Clique));
 52     ans = 0;
 53     for(int i = N; i >= 1; i--)
 54     {
 55         used[1] = i; int Size = 0;
 56         for(int j = i+1; j <= N; j++)
 57             if(g[i][j] == 1)
 58                 New[1][Size++] = j;
 59         DFS(Size, 1);
 60         Clique[i] = ans;
 61     }
 62     return ans;
 63 }
 64 
 65 void find_cc(int x,int y,int key){
 66     p[x][y] = key;
 67     for(int i = 0;i < 4;i++){
 68         int xx = x+dx[i];
 69         int yy = y+dy[i];
 70         if(xx <= 0 || xx > n || yy <= 0 || yy > m || p[xx][yy]) continue;
 71         if(G[xx][yy] == '.') continue;
 72         if(G[xx][yy] == G[x][y]) find_cc(xx,yy,key);
 73     }
 74 }
 75 
 76 void build(){
 77     memset(vis,0,sizeof(vis));
 78     memset(p,0,sizeof(p));
 79     int cnt = 0;
 80     for(int i = 1;i <= n;i++){
 81             for(int j = 1;j <= m;j++){
 82                     if(G[i][j] == '.' && !p[i][j]) p[i][j] = ++cnt;
 83                     if(G[i][j] >= '0' && G[i][j] <= '9'&& !p[i][j]){
 84                         find_cc(i,j,++cnt);
 85                     }
 86                 }
 87     }
 88    /* for(int i = 1;i <= n;i++){
 89         for(int j = 1;j <= m;j++) printf("%d ",p[i][j]);
 90         printf("\n");
 91     }*/
 92     for(int i = 1;i <= maxn;i++)
 93         for(int j = 1;j <= maxn;j++) g[i][j] = 1;
 94     for(int i = 1;i <= n;i++){
 95         for(int j = 1;j <= m;j++){
 96             for(int k = 0;k < 4;k++){
 97                 int x = i+dx[k];
 98                 int y = j+dy[k];
 99                 if(x <= 0 || x > n || y <= 0 || y > m) continue;
100                 int u = p[i][j];
101                 int v = p[x][y];
102                 if(u != v) g[u][v] = g[v][u] = 0;
103             }
104         }
105     }
106    /* for(int i = 1;i <= cnt;i++){
107         for(int j = 1;j <= cnt;j++) printf("g[%d][%d] = %d\n",i,j,g[i][j]);
108     }*/
109     N = cnt;
110 }
111 
112 int main(){
113     int T;
114    // freopen("in.txt","r",stdin);
115     //freopen("outtt.txt","w",stdout);
116 
117     scanf("%d",&T);
118     int kase = 0;
119     while(T--){
120         scanf("%d %d",&n,&m);
121         for(int i = 1;i <= n;i++){
122             scanf("%s",G[i]+1);
123         }
124         build();
125         //printf("N = %d\n",N);
126         printf("Case #%d: %d\n",++kase,MaxClique());
127     }
128     return 0;
129 }
View Code

 

 

 

 

Matching Compressed String

 

Alice's Classified Message

 

Frog and String

 

The Shields

 

Kingdom of Tree

 

转载于:https://www.cnblogs.com/wuyuewoniu/p/4970378.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值