好不容易來一次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...