題意:
給你乙個n * n 的矩陣,和x所在的座標,問你最少放多少個**可以把圖里的所有x都覆蓋,每個**可以覆蓋一行,或者一列。
思路:最小頂點覆蓋,最小頂點覆蓋=二分匹配,每一行最多放乙個,每一列最多放乙個,對於每乙個點,他只要被一行或者一列照應就行了。
所以直接把x所在的點的行和列連線在一起,(二分後對於當前點相當於只選擇乙個),這樣最後每個點都會被照應到,同時盡可能地去匹配了,也就是盡可能地減少了浪費。
#include
#include
#define n_node 550
#define n_edge 255000
typedef
struct
star;
star e[n_edge];
int list[n_node]
,tot;
int mk_dfs[n_node]
,mk_gx[n_node];
void
add(
int a ,
int b)
intdfs_xyl
(int x)
}return0;
}int
main
()int sum =0;
memset
(mk_gx ,
255,
sizeof
(mk_gx));
for(i =
1;i <= n ;i ++)
printf
("%d\n"
,sum);
}return0;
}
POJ3041 最小頂點覆蓋
題意 給你乙個n n 的矩陣,和x所在的座標,問你最少放多少個 可以把圖里的所有x都覆蓋,每個 可以覆蓋一行,或者一列。思路 最小頂點覆蓋,最小頂點覆蓋 二分匹配,每一行最多放乙個,每一列最多放乙個,對於每乙個點,他只要被一行或者一列照應就行了。所以直接把x所在的點的行和列連線在一起,二分後對於當前...
POJ3041最小點覆蓋
頂點覆蓋 g中的任意邊都至少有乙個端點屬於s的頂點幾何 s 屬於 v 最小頂點覆蓋,就是盡可能少的選出一些點構成集合s,使得圖g中任意邊,都至少又乙個端點屬於s 每一列當成乙個點,每一行當成乙個點,若行節點和列節點之間有邊,則表明該行列該列有乙個障礙物。主要是構圖 將每一行當成乙個點,構成集合1,每...
poj3041 最小點覆蓋
題目問的是使用 一次可以摧毀一行或一列的隕石,最少使用多少次?這個是求最小點覆蓋的問題,也就是問最少多少點可以覆蓋所有的邊。然後最小點覆蓋又可以等於二分圖的最大匹配,所以就建圖求最大匹配 這題 建圖的用的隕石的x座標和y座標,把隕石的x座標集合和y座標集合作為2個點集,然後把每乙個隕石對應的x,y連...