POJ2226 不错的最小顶点覆盖
生活随笔
收集整理的這篇文章主要介紹了
POJ2226 不错的最小顶点覆盖
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
? ? ? ?給你一個n * m 的矩陣,上面有" * " 和 " . " ,讓你用少的木板吧所有" * "覆蓋,木板寬度是1,長度隨意,木板可以重疊,但是不能覆蓋到" . "上。
思路:
? ? ? 這個題目建圖方式不錯,回想下最基本的最小定點覆蓋,也是在n * m 的矩陣上,覆蓋某些點,但是可以覆蓋" . "那樣直接匹配行列就行了,這個如果是***.***就得用兩個了,那我們可以直接把所有的行都離散化出來,吧所有的列都離散化出來,比如
*.*. ? ? 按照行離散成 1.2. ? 按照列離散成 ? 1 . 4 .
.*** ? ? ? ? ? ? ? ? ? ? ? ? ?.333 ? ? ? ? ? ? ? ? ? ? ? ? ? . 3 4 5
***. ? ? ? ? ? ? ? ? ? ? ? ? ? 444. ? ? ? ? ? ? ? ? ? ? ? ? ? 2 3 4 .
? ? ? ?給你一個n * m 的矩陣,上面有" * " 和 " . " ,讓你用少的木板吧所有" * "覆蓋,木板寬度是1,長度隨意,木板可以重疊,但是不能覆蓋到" . "上。
思路:
? ? ? 這個題目建圖方式不錯,回想下最基本的最小定點覆蓋,也是在n * m 的矩陣上,覆蓋某些點,但是可以覆蓋" . "那樣直接匹配行列就行了,這個如果是***.***就得用兩個了,那我們可以直接把所有的行都離散化出來,吧所有的列都離散化出來,比如
*.*. ? ? 按照行離散成 1.2. ? 按照列離散成 ? 1 . 4 .
.*** ? ? ? ? ? ? ? ? ? ? ? ? ?.333 ? ? ? ? ? ? ? ? ? ? ? ? ? . 3 4 5
***. ? ? ? ? ? ? ? ? ? ? ? ? ? 444. ? ? ? ? ? ? ? ? ? ? ? ? ? 2 3 4 .
..*. ? ? ? ? ? ? ? ? ? ? ? ? ? ?..5. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? . . 4 .
接下來就直接正常行列匹配就行了("*"所在的行和列匹配)。
#include<stdio.h> #include<string.h>#define N_node 3000 #define N_edge 6000typedef struct {int to ,next; }STAR;typedef struct {int r ,l; }NODE;STAR E[N_edge]; NODE map[60][60]; int mk_dfs[N_node] ,mk_gx[N_node]; int list[N_node] ,tot; int mp[60][60];void add(int a ,int b) {E[++tot].to = b;E[tot].next = list[a];list[a] = tot; }int DFS_XYL(int x) {for(int k = list[x] ;k ;k = E[k].next){int to = E[k].to;if(mk_dfs[to]) continue;mk_dfs[to] = 1;if(mk_gx[to] == -1 || DFS_XYL(mk_gx[to])){mk_gx[to] = x;return 1;}}return 0; }int main () {int n ,m ,i ,j ,maxr;char str[60];while(~scanf("%d %d" ,&n ,&m)){memset(mp ,0 ,sizeof(mp));for(i = 1 ;i <= n ;i ++){scanf("%s" ,str);for(j = 1 ;j <= m ;j ++)mp[i][j] = str[j-1] == '*';}int now = 0;memset(map ,0 ,sizeof(map));for(i = 1 ;i <= n ;i ++)for(j = 1 ;j <= m ;j ++){if(!mp[i][j]) {map[i][j].r = 0;continue;}if(mp[i][j] && !mp[i][j-1])map[i][j].r = ++now;else map[i][j].r = map[i][j-1].r;}maxr = now;now = 0;for(j = 1 ;j <= m ;j ++)for(i = 1 ;i <= n ;i ++){if(!mp[i][j]){map[i][j].l = 0;continue;}if(mp[i][j] && !mp[i-1][j])map[i][j].l = ++now;else map[i][j].l = map[i-1][j].l;}memset(list ,0 ,sizeof(list));tot = 1;for(i = 1 ;i <= n ;i ++)for(j = 1 ;j <= m ;j ++)if(map[i][j].r && map[i][j].l)add(map[i][j].r ,map[i][j].l);int sum = 0;memset(mk_gx ,255 ,sizeof(mk_gx));for(i = 1 ;i <= maxr ;i ++){memset(mk_dfs ,0 ,sizeof(mk_dfs));sum += DFS_XYL(i);}printf("%d\n" ,sum);}return 0; }
總結
以上是生活随笔為你收集整理的POJ2226 不错的最小顶点覆盖的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POJ3041 最小顶点覆盖
- 下一篇: POJ2594 最小路径覆盖