洛谷P4380 [USACO18OPEN]Multiplayer Moo
第一问:
用广搜类似用\(floodfill\)的方法。
第二问:
暴力枚举加剪枝,对于每个连通块,枚举跟这个连通块相连的其他与他颜色不同的连通块,然后向外扩展合并颜色与他们俩相同的连通块。扩展合并颜色的时候需要在以每个连通块为节点的图上广搜,每次都将不在当前双色连通块内连通块且颜色和当前双色其一相同的点加入队列。注意在建图的时候,只连接相邻的颜色不同的连通块,然后有每个边只会被扩展一次,因为边一定连接颜色不同的块,如果该边被遍历了,所以其实该边的双色连通块的两个颜色都确定了,也就找过了。而且防止出现多次计算的情况,我们枚举两个颜色连通块时,要满足编号小的不枚举,因为肯定在之间就已经枚举过了。
#include <bits/stdc++.h>
using namespace std;
int n, maxn1, maxn2, abc, N, id, id2, cnt = 1, ma[256][256], lin[1001000];
int vis1[256][256], vis2[1000010], fa[1010001], sum[1001011], color[1000011];//vis1记录的是每个点的连通块标号,sum记得是每个连通块的大小, color是每个连通块的颜色。
int di[5] = {0, 0, 1, -1};
int dj[5] = {-1, 1, 0, 0};
struct da {int i, j, num;} data[251 * 251]; int cmp(da a, da b){return a.num < b.num;}
struct edg {int to, nex, vis;} e[1011100];
inline void add(int f, int t)
{
e[++cnt].to = t;
e[cnt].nex = lin[f];
lin[f] = cnt;
}
inline void init()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
scanf("%d", &ma[i][j]);
}
void bfs(int i, int j)
{
id++;
queue <int> qi, qj;
qi.push(i);
qj.push(j);
color[id] = ma[i][j];
vis1[i][j] = id;
while (!qi.empty())
{
int ni = qi.front(); qi.pop();
int nj = qj.front(); qj.pop();
sum[id]++;
for (int i = 0; i < 4; i++)
{
int i1 = ni + di[i];
int j1 = nj + dj[i];
if (i1 > 0 && j1 > 0 && i1 <= n && j1 <= n && ma[i1][j1] == ma[ni][nj] && (!vis1[i1][j1]))
qi.push(i1), qj.push(j1), vis1[i1][j1] = id;
if (vis1[i1][j1] != id)
add(id, vis1[i1][j1]), add(vis1[i1][j1], id);//将他们的id相连
}
}
maxn1 = max(maxn1, sum[id]);
}
void bfs2(int now, int end)
{
queue <int> q;
vis2[now] = vis2[end] = ++id2;//一个连通块只能找一
q.push(now), q.push(end);
int bfssum = 0;
while (!q.empty())
{
int cur = q.front();
q.pop();
bfssum += sum[cur];
for (int i = lin[cur]; i; i = e[i].nex)
{
int to = e[i].to;
if (vis2[to] == id2 || to < min(end, now) || (color[to] != color[now] && color[to] != color[end]) ) continue;
if (e[i].vis) continue;
e[i].vis = e[i ^ 1].vis = id2;
vis2[to] = id2;//
q.push(to);
}
}
maxn2 = max(maxn2, bfssum);
}
int main()
{
init();
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if (!vis1[i][j])
bfs(i, j);
printf("%d\n", maxn1);
for (int i = 1; i <= id; i++)//枚举每个连通块
{
for (int j = lin[i]; j; j = e[j].nex)
{
int to = e[j].to;
if (to <= i || e[j].vis) continue;
e[j].vis = e[j ^ 1].vis = 1;
bfs2(i, to);
if (maxn2 >= n * n / 2)
printf("%d", maxn2), exit(0);
}
}
printf("%d\n", maxn2);
return 0;
}
/*
*/
https://www.luogu.org/problem/P4380
洛谷P4380 [USACO18OPEN]Multiplayer Moo的更多相关文章
- 分数规划模板(洛谷P4377 [USACO18OPEN]Talent Show)(分数规划,二分答案,背包)
分数规划是这样一个东西: 给定若干元素,每个元素有两个属性值\(a_i,b_i\),在满足题目要求的某些限制下选择若干元素并求出\(\frac{\sum a}{\sum b}\)的最大值. 如果没有限 ...
- 洛谷【P1885】Moo
我对分治的理解:https://www.cnblogs.com/AKMer/p/9728574.html 题目传送门:https://www.luogu.org/problemnew/show/P18 ...
- 洛谷 P4378 [USACO18OPEN]Out of Sorts S(树状数组求冒泡排序循环次数)
传送门:Problem P4378 https://www.cnblogs.com/violet-acmer/p/9833502.html 要回宿舍休息了,题解明天再补吧. 题解: 定义一数组 a[m ...
- 洛谷 P4379 [USACO18OPEN]Lemonade Line
P4379 [USACO18OPEN]Lemonade Line 题目描述 这是农场上一个炎热的夏日,Farmer John要给他的 NN 头奶牛发柠檬汽水了!所有的 NN 头奶牛(方便起见,编号为 ...
- 洛谷 P4375 [USACO18OPEN]Out of Sorts G(树状数组求冒泡排序循环次数加强版)
传送门:Problem 4375 参考资料: [1]:https://www.cnblogs.com/Miracevin/p/9662350.html [2]:https://blog.csdn.ne ...
- 洛谷P4374 [USACO18OPEN]Disruption(树链剖分+线段树)
传送门 不难发现,每一条额外修的路径,会对原树上$(u,v)$路径上的所有边产生贡献 于是这就变成了一个路径修改 那么我们把每一条边赋值到它连接的两个点中深度较大的那个上面,然后每一次用树剖+线段树做 ...
- [USACO18OPEN] Multiplayer Moo (并查集+维护并查集技巧)
题目大意:给你一个N*N的棋盘,棋盘上每个点都有一个权值 第一问求一个权值形成的最大联通块中点的数量 第一问求两个权值共同形成的最大联通块中点的数量 提供一种并查集的做法:(感谢大佬们的题解)第一问把 ...
- 洛谷 P4377 [USACO18OPEN]Talent Show + 分数规划
分数规划 分数规划可以用来处理有关分数即比值的有关问题. 而分数规划一般不单独设题,而是用来和dp,图论,网络流等算法结合在一起. 而基础的做法一般是通过二分. 二分题目我们都知道,需要求什么的最小或 ...
- DP【洛谷P3135】[USACO16JAN]堡哞Fort Moo
[洛谷P3135][USACO16JAN]堡哞Fort Moo Bessie和她的朋友Elsie正在建筑一个堡垒,与任何一个好的堡垒一样,这个需要一个强固的框架.Bessie想造一个轮廓是1m宽的空心 ...
随机推荐
- MOOC 数据库笔记(三):关系模型之基本概念
关系模型的基本概念 关系模型简述 1.最早由E.F.Codd在1970年提出. 2.是从表(Table)及表的处理方式中抽象出来的,是在对传统表及其操作进行数学化严格定义的基础上,引入集合理论与逻辑学 ...
- spring Boot 学习(一、Spring Boot与缓存)
JSR-107.Spring缓存抽象.整合Redis Java Caching定义了5个核心接口,分别是CachingProvider, CacheManager, Cache, Entry 和 Ex ...
- C# vb .net图像合成-合成艺术字 照片合成艺术字
在.net中,如何简单快捷地实现图像合成呢,比如合成文字,合成艺术字,多张图片叠加合成等等?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码 ...
- 编辑/etc/passwd文件进行权限升级的技巧
0x00 前言 在本文中,我们将学习“修改/etc/passwd文件以创建或更改用户的root权限的各种方法”.有时,一旦目标被攻击,就必须知道如何在/etc/passwd文件中编辑自己的用户以进行权 ...
- Python学习日记(三十三) Mysql数据库篇 一
背景 Mysql是一个关系型数据库,由瑞典Mysql AB开发,目前属于Oracle旗下的产品.Mysql是目前最流行的关系型数据库管理系统之一,在WEB方面,Mysql是最好的RDBMS(Relat ...
- 电脑 DNS纪要
电脑 DNS说明 1.电脑的DNS必须设置成114.114.114.114才能上网? 电脑的DNS不是必须设置成114.114.114.114才能上网,而只是DNS设置为这个地址刚好能够上网.设置合适 ...
- Docker容器网络篇
Docker容器网络篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Docker的网络模型概述 如上图所示,Docker有四种网络模型: 封闭式网络(Closed conta ...
- 决策树算法原理--good blog
转载于:http://www.cnblogs.com/pinard/p/6050306.html (楼主总结的很好,就拿来主义了,不顾以后还是多像楼主学习) 决策树算法在机器学习中算是很经典的一个算法 ...
- 【Pet HDU - 4707 】【利用并查集找深度】
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const i ...
- 2019安徽省程序设计竞赛 I.你的名字(序列自动机)
这题和今年南昌邀请网络预选赛M题很像啊,不过主串数量不是一个了 都是在主串中判断子串是不是属于主串的一个子序列 #include <iostream> #include <cstri ...