POJ2226 不錯的最小頂點覆蓋

2022-09-05 01:18:13 字數 2340 閱讀 6050

題意:

給你乙個n * m 的矩陣,上面有" * " 和 " . " ,讓你用少的木板吧所有" * "覆蓋,木板寬度是1,長度隨意,木板可以重疊,但是不能覆蓋到" . "上。

思路:這個題目建圖方式不錯,回想下最基本的最小定點覆蓋,也是在n * m 的矩陣上,覆蓋某些點,但是可以覆蓋" . "那樣直接匹配行列就行了,這個如果是***.***就得用兩個了,那我們可以直接把所有的行都離散化出來,吧所有的列都離散化出來,比如

*.*.     按照行離散成 1.2.   按照列離散成   1 . 4 .

.***                          .333                           . 3 4 5

***.                           444.                           2 3 4 .

..*.                            ..5.                               . . 4 .

接下來就直接正常行列匹配就行了("*"所在的行和列匹配)。

#include

#include

#define n_node 3000

#define n_edge 6000

typedef

struct

star;

typedef

struct

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)

intdfs_xyl

(int x)

}return0;

}int

main

()int now =0;

memset

(map ,0,

sizeof

(map));

for(i =

1;i <= n ;i ++)

for(j =

1;j <= m ;j ++)

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]

&&!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 ++)

printf

("%d\n"

,sum);

}return0;

}

poj 2226 還是最小點覆蓋的匹配問題

這題比3041要有點難度,主要是在判斷節點的時候,要兩次掃瞄輸入的矩陣。這個叫我shi也想不到啊。人家discuss裡面給了很好的模板,學著點吧。具體的分析請看下面 sample 4 4 把行裡面連在一起的坑連起來視為乙個點,即一塊橫木板,編上序號,sample則轉化為 1 0 2 0 0 3 3 ...

poj 2226 還是最小點覆蓋的匹配問題

這題比3041要有點難度,主要是在判斷節點的時候,要兩次掃瞄輸入的矩陣。這個叫我shi也想不到啊。人家discuss裡面給了很好的模板,學著點吧。具體的分析請看下面 sample 4 4 把行裡面連在一起的坑連起來視為乙個點,即一塊橫木板,編上序號,sample則轉化為 1 0 2 0 0 3 3 ...

POJ3233不錯的矩陣 矩陣套矩陣

題意 給乙個n n的矩陣a,然後求s a a 2 a 3 a k.思路 矩陣快速冪,這個題目挺新穎的,以往的矩陣快速冪都是退出公式,然後構造矩陣,這個比較特別,直接上子矩陣吧 a 1 平方後得到 a 2 1 a 三次方 a 3 1 a a 2 0 1 0 1 0 1 這樣就行了,還有注意這個是矩陣套...