題意:
給你乙個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 這樣就行了,還有注意這個是矩陣套...