ZJOI2009狼和羊的故事

2023-10-13 14:59
文章标签 故事 zjoi2009

本文主要是介绍ZJOI2009狼和羊的故事,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述

狼爱上羊啊爱的疯狂,谁让他们真爱了一场;狼爱上羊啊并不荒唐,他们说有爱就有方向......” Orez听到这首歌,心想:狼和羊如此和谐,为什么不尝试羊狼合养呢?说干就干! Orez的羊狼圈可以看作一个n*m个矩阵格子,这个矩阵的边缘已经装上了篱笆。可是Drake很快发现狼再怎么也是狼,它们总是对羊垂涎三尺,那首歌只不过是一个动人的传说而已。所以Orez决定在羊狼圈中再加入一些篱笆,还是要将羊狼分开来养。 通过仔细观察,Orez发现狼和羊都有属于自己领地,若狼和羊们不能呆在自己的领地,那它们就会变得非常暴躁,不利于他们的成长。 Orez想要添加篱笆的尽可能的短。当然这个篱笆首先得保证不能改变狼羊的所属领地,再就是篱笆必须修筑完整,也就是说必须修建在单位格子的边界上并且不能只修建一部分。

输入输出格式

输入格式:

文件的第一行包含两个整数n和m。接下来n行每行m个整数,1表示该格子属于狼的领地,2表示属于羊的领地,0表示该格子不是任何一只动物的领地。

输出格式:

文件中仅包含一个整数ans,代表篱笆的最短长度。

输入样例#1:

2 2 2 2 1 1

输出样例#1:

2

解析:

      狼和羊被分开等于说任意狼和羊不连通,容易想到最小割。把狼和羊(1和2)分成两部分,源点向1连边,2向汇点连边,容量inf;1和2交界处连边,然后0向四周连边(因为0周围可任意切割),1向相邻的2连边,容量为1。然后Dinic或者ISAP。

以下是我的代码(依然比较宽。。):

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <iostream>
  4 #define S (n * m + 1)
  5 #define T (n * m + 2)
  6 #define ID(x, y) ((x) * m + (y))
  7 #define INF 0x7f7f7f7f
  8 using namespace std;
  9 
 10 const int dx[] = {0, 0, 1, -1};
 11 const int dy[] = {-1, 1, 0, 0};
 12 
 13 struct Edge
 14 {
 15 	int v, next, cap;
 16 	Edge(int a = 0, int b = 0, int c = 0)
 17 	:v(a), next(b), cap(c){};
 18 }edge[100020];
 19 int n, m, cnt;
 20 int head[10010], cur[10010], dep[10010], map[10010];
 21 
 22 void AddEdge(int _u, int _v, int _c)
 23 {
 24 	edge[cnt] = Edge(_v, head[_u], _c);
 25 	head[_u] = cnt++;
 26 	edge[cnt] = Edge(_u, head[_v], 0);
 27 	head[_v] = cnt++;
 28 }
 29 bool bfs()
 30 {
 31 	int queue[10010], qHead = 0, qTail = 0;
 32 	queue[qTail++] = S;
 33 	memset(dep, 0, sizeof(dep));
 34 	dep[S] = 1;
 35 	while(qTail > qHead)
 36 	{
 37 		int p = queue[qHead++];
 38 		for(int i = head[p]; ~i; i = edge[i].next)
 39 			if(edge[i].cap && !dep[edge[i].v])
 40 			{
 41 				dep[edge[i].v] = dep[p] + 1;
 42 				queue[qTail++] = edge[i].v;
 43 			}
 44 	}
 45 	return dep[T];
 46 }
 47 bool dfs(int now)
 48 {
 49 	if(now == T) return true;
 50 	for(int &i = cur[now]; ~i; i = edge[i].next)
 51 		if(edge[i].cap && dep[edge[i].v] == dep[now] + 1 && dfs(edge[i].v))
 52 		{
 53 			edge[i].cap--, edge[i ^ 1].cap++;
 54 			return true;
 55 		}
 56 	return false;
 57 }
 58 int Dinic()
 59 {
 60 	int res = 0;
 61 	while(bfs())
 62 	{
 63 		memcpy(cur, head, sizeof(head));
 64 		while(dfs(S))
 65 			res++;
 66 	}
 67 	return res;
 68 }
 69 int main()
 70 {
 71 	memset(head, -1, sizeof(head));
 72 	scanf("%d%d", &n, &m);
 73 	for(int i = 0; i < n; i++)
 74 		for(int j = 0; j < m; j++)
 75 			scanf("%d", &map[ID(i, j)]);
 76 	for(int i = 0; i < n; i++)
 77 		for(int j = 0; j < m; j++)
 78 			switch(map[ID(i, j)])
 79 			{
 80 				case 1:
 81 					AddEdge(S, ID(i, j), INF);
 82 					for(int k = 0; k < 4; k++)
 83 						if(i + dx[k] < n && i + dx[k] >= 0
 84 						&& j + dy[k] < m && j + dy[k] >= 0
 85 						&& map[ID(i + dx[k], j + dy[k])] != 1)
 86 							AddEdge(ID(i, j), ID(i + dx[k], j + dy[k]), 1);
 87 					break;
 88 				case 2:
 89 					AddEdge(ID(i, j), T, INF);
 90 					for(int k = 0; k < 4; k++)
 91 						if(i + dx[k] < n && i + dx[k] >= 0
 92 						&& j + dy[k] < m && j + dy[k] >= 0
 93 						&& map[ID(i + dx[k], j + dy[k])] == 0)
 94 							AddEdge(ID(i + dx[k], j + dy[k]), ID(i, j), 1);
 95 					break;
 96 				default:
 97 					for(int k = 0; k < 4; k++)
 98 						if(i + dx[k] < n && i + dx[k] >= 0
 99 						&& j + dy[k] < m && j + dy[k] >= 0
100 						&& map[ID(i + dx[k], j + dy[k])] == 0)
101 							AddEdge(ID(i, j), ID(i + dx[k], j + dy[k]), 1);
102 			}
103 	printf("%d\n", Dinic());
104 
105 	return 0;
106 }//Rhein_E
View Code


转载于:https://www.cnblogs.com/Rhein-E/p/9323589.html

这篇关于ZJOI2009狼和羊的故事的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/204032

相关文章

接下来的这个故事就来自于我的先生,一个交警的口述

这可是没有过的事情。先生是个交通警察,在事故科工作已经五、六年了,对于生离死别、阴阳两隔,用他自己的话说是已经有些麻木了;不用说他,就连我,对那些卷宗里血淋淋的照片都已经有些漠然。他的办公室常有悲悲切切的人来哭诉,他却总能在复议时做到不掺杂感情。我是个爱哭的女人,偏偏先生对于眼泪早已有了职业的免疫力,他说要是每个事故他都要为每个逝者陪眼泪的话,他早就活不下去了,但是今天不同,他分明是掉过泪了。

JD 1204:农夫、羊、菜和狼的故事

OJ题目:click here~~ #define vegetable_go 0#define vegetable_come 1#define sheep_go 2#define sheep_come 3#define wolf_go 4#define wolf_come 5#define nothing_go 6#define nothing_come 7using

2020年数据术语的故事

点击上方蓝色字体,选择“设为星标” 回复”资源“获取更多资源 2020年整个技术圈子要说话题最多的,应该是大数据方向。新感念层出不穷,数据湖概念就是其中之一。这篇文章是关于数据仓库、数据湖、数据集市、数据中台等一些列的概念和发展进程。希望给大家带来一个全面的感知。 本文作者:Murkey学习之旅、开心自由天使 本文整理:大数据技术与架构,未经允许不得转载。 如今,随着诸如互联网以及物联网等

PMP–一、二、三模–分类–14.敏捷–技巧–故事点

文章目录 技巧一模14.敏捷--术语表-自组织团队--自组织团队是一种跨职能团队,其中为实现团队目标团队成员根据需要轮换着发挥领导作用。 自组织团队的核心就是做什么事情,团队成员说了算。61、 [单选] 作为估算活动持续时间过程的一部分,项目经理促成了与产品负责人和Scrum团队的冲刺计划会议。项目经理将用户故事分解为较小的任务项,以小时为单位估算所需时间,并根据团队的能力确定冲刺待办事项列

王楠首次讲述Cocos Creator背后的故事

Cocos Creator发布至今,得到了许多开发者的支持和喜爱,甚至有小伙伴留言说:幸福来得太突然。水滴石穿,非一日之功。这款工具从诞生到问世究竟经历了怎么样的曲折,未来又会走向何方?这方面,大概没有谁比Cocos Creator制作人王楠更有发言权了。   今天不妨抽出10分钟,听听王楠的讲述,相信或多或少会对你有所启发。   开发Cocos Creator的初衷是什么?   我和几

不得不服的华为管理:任正非给员工讲的18个故事

不得不服的华为管理:任正非给员工讲的18个故事 电商报2016年02月19日07:21 我要分享 [摘要]华为用“灰度”的思想指导各项实践,“灰度”思想是华为成功的重要法宝。 腾讯科技精选优质自媒体文章,文中所述为作者独立观点,不代表腾讯科技立场。 (微信公众号:电商报) 1、红舞鞋 这是安徒生一个流传甚广的童话故事: 有一双非常漂亮、非常吸引人的红色的舞鞋,女孩若把它穿在脚上

一个程煦媛的故事

故事是这样的: 程煦媛背着一堆书(n》10)出图书馆。 警报响了,扫地老太太让她看看是哪本书把警报弄响,煦媛把书倒出来,准备一本一本的测。 扫地老太太见状急了,把书分成两部分,第一份过了一下,响了。 又把这一份分成两份接着测,三回就找到了,扫地老太太用那雷人的眼神,好像在说O(n)和O(log2n)都分不清。 这个故事好像在说连扫地老太太都会二分算法(高手在民间),身为程序员的程煦媛竟然

极盾故事|某金融租赁机构应用数据保护新策略:“动态脱敏”“二次授权”

数据的流通使用是创新的动力,但安全和合规是不可逾越的底线。企业如何在这三者之间找到平衡点? 极盾科技,助力某金融租赁机构,基于极盾·觅踪构建应用数据动态脱敏系统,实现10+核心应用系统的统一管理,对个人金融信息5大要素(姓名、身份证、手机号、银行卡、地址)基于用户身份实现差异化动态脱敏,并结合“二次授权”策略实现敏感数据访问和文件导出的控制,以满足更多场景的不同需求。 01 数据可用与

Tableau 社区项目 | 参与 Data+TV 挑战,洞悉全球电视剧集数据的精彩故事!

如果你钟爱某部电视剧集,正苦于没有数据练手,就快来参与 Data+TV 挑战吧~ 去年,Tableau 和 IMDb 携手发起 Data+Movies 挑战,吸引了全球各地的数据爱好者与影迷参与。今年,TC24 Viz 竞赛也以此为主题,让我们领略了电影数据可视化的魅力。 近日,Tableau 再度携手 IMDb 发起 Data+TV 挑战,让大家能够从电视剧观众与分析师的视角,用数据讲述更精彩

软件工程 用户故事地图 是什么 怎么用 实例

用户故事地图是一种将用户故事可视化的方法   用户故事地图的方法主要用于解决敏捷需求分析过程中的问题: 用户需求难以排列优先级。很难了解不同粒度故事(史诗故事、主题故事以及故事)之间的关系。不能方便地了解系统提供的功能的完整性。不能方便地了解系统提供的工作流。不能方便地利用递增和迭代的方式去确定发布计划以及发布目标。   在精益中有MVP(Minimum Viable Product,最