wikioi 1022 覆盖

原创 2013年12月03日 21:48:38

http://wikioi.com/problem/1022/

一道二分图匹配,关键在于怎么建边,由题覆盖的为2个相连的陆地,我们可以看作是一块陆地和另一块陆地进行了匹配

于是就可以找到一个陆地,把这和四周的陆地进行加边,接下来就是匹配了

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;const int maxn = 40000+100 ;
int n , m , K ;
int  tot , clock_vis, res = 1;
int head[maxn];
int vis[maxn];
int lin[maxn];
int dx[] = {0 , 0 , -1 , 1} ;
int dy[] = {1 , -1 , 0 , 0} ;
struct node{
	int next,v;
}e[maxn] ;
void add(int u,int v) {
	e[tot].v = v ;
	e[tot].next = head[u] ;
	head[u] = tot++ ;
}
bool find(int u) {
	for(int i = head[u] ; i != -1 ; i = e[i].next) {
		int v = e[i].v ;
		if(vis[v] == clock_vis) continue ;
		vis[v] = clock_vis ;//时间标记
		if(!lin[v] || find(lin[v])) {
			lin[v] = u ;
			return true ;
		}
	}
	return false ;
}

int main() {
	scanf("%d%d%d",&n,&m,&K) ;
	int x1 , y1 ;
	for(int i = 0 ; i < K ; i++) {
		scanf("%d%d",&x1,&y1) ;
		x1-- ; 
		y1-- ;
		vis[x1*m+y1] = -1 ;//一维保存坐标
	}
	for(int i = 0 ; i < n ; i++) {
		for(int j = (i%2) ; j < m ; j+=2) if(vis[i*m+j] != -1){
			head[res] = -1;
			for(int k = 0 ; k <=3 ; k++) {
				int nx = i + dx[k] ;
				int ny = j + dy[k] ;
				if(nx < 0 || ny < 0 || nx >= n || ny >= m) continue ;
				if(vis[nx*m+ny] == -1) continue ;
				add(res, nx*m+ny) ;//加边
			}
			res++ ;//记录陆地数
		}
	}
	int ans = 0 ;
	for(int i = 1 ; i < res ; i++){//二分匹配
		clock_vis= i ;
		if(find(i)) ans++ ;
	}
	printf("%d",ans) ;
	return 0 ;
}
		


[wikioi 1022]覆盖

在这里首先感谢wjk大神对于我的帮助,没有他,我还很难想出建立二分图的模型。我按照我的个人想法,用最大流写了此题,但是情况不尽人意: 相当牛叉的时间(看最后一个点),惨象已不必多说…...

Codevs 1022 覆盖

时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description有一个N×MN×M的单位方格中,其中有些方格是水塘,其他方格是陆地。如果要用...

codevs 1022 覆盖

题目 分析:每2*1 让人想到了二分图,讲每个点上下左右是陆地的点连起来,跑匈牙利算法就好了。 #include #include #include #include using name...

Codevs1022:覆盖

1022 覆盖  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题解  查...
  • zjq_01
  • zjq_01
  • 2017年05月24日 19:17
  • 123

code vs 1022 覆盖 (匈牙利算法)

1022 覆盖  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题解  查看运...

【codevs3052&&1022】多米诺&覆盖,二分图

好学生将来不一定有好出息,坏学生将来不一定有坏出息。

wikioi-天梯-普及一等-贪心-1214:线段覆盖

题目描述 Description     给定x轴上的N(0 输入描述 Input Description     输入第一行是一个整数N。接下来有N行,每行有二个空...

wikioi1214-线段覆盖

线段覆盖 题目描述 Description     给定x轴上的N(0 输入描述 Input Description     输入第一行是一个整数N。接下来...

求高人指点:wikioi 2171 棋盘覆盖

死活只有90分,到底哪里有问题。 题目地址:http://www.wikioi.com/problem/2171/   代码如下:   #include #include #include ...

wikioi 3027 线段覆盖 2

题目描述 Description 数轴上有n条线段,线段的两端都是整数坐标,坐标范围在0~1000000,每条线段有一个价值,请从n条线段中挑出若干条线段,使得这些线段两两不覆盖(端点可...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:wikioi 1022 覆盖
举报原因:
原因补充:

(最多只允许输入30个字)