wikioi 1022 覆蓋(匈牙利)

2021-09-06 17:26:31 字數 1727 閱讀 1732

好不容易來一次1a,,水題啊。。

染色後裸匈牙利orz

#include #include #include #include #include #include using namespace std;

#define rep(i, n) for(int i=0; i

#define for1(i,a,n) for(int i=(a);i<=(n);++i)

#define for2(i,a,n) for(int i=(a);i

#define for3(i,a,n) for(int i=(a);i>=(n);--i)

#define for4(i,a,n) for(int i=(a);i>(n);--i)

#define cc(i,a) memset(i,a,sizeof(i))

#define max(a,b) ((a)>(b)?(a):(b))

#define min(a,b) ((a)

#define read(a) a=getnum()

#define print(a) printf("%d", a)

inline int getnum()

const int n=10005;

int n, m, a[105][105], imap[105][105], cnt;

int ihead[n], inext[n*4], to[n*4];

bool visy[n];

int ly[n], x[n], cntx;

inline void add(const int &u, const int &v)

bool ifind(const int &u)

} return false;

}int main() {

read(n); read(m);

int k=getnum();

for1(i, 1, k) a[getnum()][getnum()]=1;

int last;

int u;

for1(i, 1, n) {

last=i;

for1(j, 1, m) {

if(!a[i][j] && (last%2)) {

u=(i-1)*m+j;

if(i>1 && !a[i-1][j]) add(u, u-m);

if(i1 && !a[i][j-1]) add(u, u-1);

if(j

有乙個n×m的單位方格中,其中有些方格是水塘,其他方格是陸地。如果要用1×2的矩陣區覆蓋(覆蓋過程不容許有任何部分重疊)這個陸地,那麼最多可以覆蓋多少陸地面積。

輸入檔案的第一行是兩個整數n,m  (1<=n,m<=100),第二行為乙個整數k( k<=50),接下來的k行,每行兩個整數x,y表示k個水塘的行列位置。(1<=x<=n,1<=y<=m)。

輸出所覆蓋的最大面積塊(1×2面積算一塊)。

4 4

61 1

1 42 2

4 14 2

4 4

4

見描述

codevs 1022覆蓋(匈牙利演算法)

嗯,先上題目描述。此題接近裸的匈牙利演算法,將陸地和其四周是陸地的點連一條邊,這樣就有了乙個無向圖。接著就是從第乙個點出發列舉未被標記的點,標記與其對應的另乙個點 因為是1 2的長方形 開了乙個四維陣列e x1 y1 x2 y2 若為零代表點 x1,y1 與 x2,y2 不連通。match x1 y...

wikioi 線段覆蓋 2

有個小錯誤調了半天,最終發現sort line,line n 錯了,後面那個是exclusive的,所以要line n 1。按照右端點從小到大排序。原因是迴圈結構中是i從1到n,i比較小的時候盡可能選右端點比較小的,這樣才可以為後面的線段留下更大的空間。f i 表示 算前i條線段時,選上第i條線段,...

1214 線段覆蓋wiki oi

題目描述 description 給定x軸上的n 0輸入描述 input description 輸入第一行是乙個整數n。接下來有n行,每行有二個空格隔開的整數,表示一條線段的二個端點的座標。輸出描述 output description 輸出第一行是乙個整數表示最多剩下的線段數。樣例輸入 samp...