【CF632F】Magic Matrix(生成树 脑洞)
大意
给定一个\(N\times N\)的矩阵,问是否满足以下三个条件:
- \(A_{i,i}=0\)
- \(A_{i,j}=A_{j,i}\)
- 对于任意的\(i,j,k\),满足\(A_{i,j}\ge max(A_{i,k},A_{k,j})\)
如果满足条件输出MAGIC,否则输出NOT MAGIC。
思路
首先,对于第一二两个条件,直接判就行了。
考虑第三个条件:
对于这个矩形,有个直观的想法就是建成一个完全图。
点\(i\)和点\(j\)间的边权就是\(A_{i,j}\),那么第三个条件就转化为了:
对于任意一个三元环的三条边\(A,B,C\)

就有以下式子:
A\ge max(B,C)\\
B\ge max(A,C)\\
C\ge max(A,B)
\end{cases}
\]
化简一下即为,\(A,B,C\)中的最大值等于\(A,B,C\)中的次大值。
考虑如何快速地判断每一个三元环:
我们从小到大加边,权值相同的边一起加入,那么在任意时刻,图像中的每个连通块一定都是一个完全图,否则就不满足条件。
- 证明: 若图中的某个连通块不是一个完全图,那么一定会缺少一些边,形成如下图的例子:

而又由于1,3之间的边一定会严格大于\(A,B\),则该三元环的最大值不等于次大值,即不满足上述条件。
对于判断加边后是否每个连通块都是完全图,我们可以用最小生成树的思想来做:
我们知道加完所有边后的图像是一个完全图,那么我们在加边时只用判断一下该边连接的两个点是否在同一连通块内就行了。如果在同一连通块内,就说明之前形成了一个缺边的非完全图,就直接不合法了。
注:权值相同的边一定要一起加入呀。
代码
其实一个就是Kruskal算法。
#include<map>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const int MAXN=2505;
int N,A[MAXN][MAXN],Len;
int Fa[MAXN],B[MAXN*MAXN],Cnt,NCnt;
struct Edge{int x,y,z;}s[MAXN*MAXN];
vector<int>P[MAXN*MAXN];map<int,int>Mp;
bool cmp(Edge A,Edge B){return A.z<B.z;}
int Find(int x){return Fa[x]==x?x:Fa[x]=Find(Fa[x]);}
int main(){
scanf("%d",&N);
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++)
scanf("%d",&A[i][j]);
for(int i=1;i<=N;i++){
if(A[i][i]){
printf("NOT MAGIC\n");
return 0;
}
for(int j=i+1;j<=N;j++){
if(A[i][j]!=A[j][i]){
printf("NOT MAGIC\n");
return 0;
}Len++;
s[Len].x=i;
s[Len].y=j;
s[Len].z=A[i][j];
B[++Cnt]=A[i][j];
}
}
sort(B+1,B+Cnt+1);
sort(s+1,s+Len+1,cmp);B[0]=-1;
for(int i=1;i<=Cnt;i++)
if(B[i]!=B[i-1])Mp[B[i]]=++NCnt;
for(int i=1;i<=Len;i++){
s[i].z=Mp[s[i].z];
P[s[i].z].push_back(i);
}
for(int i=1;i<=N;i++)Fa[i]=i;
for(int i=1;i<=NCnt;i++){
int size=P[i].size();
for(int j=0;j<size;j++){
int u=P[i][j];
int x=Find(s[u].x);
int y=Find(s[u].y);
if(x==y){
printf("NOT MAGIC\n");
return 0;
}
}
for(int j=0;j<size;j++){
int x=Find(s[P[i][j]].x);
int y=Find(s[P[i][j]].y);
if(x!=y)Fa[x]=y;
}
}
printf("MAGIC\n");
}
【CF632F】Magic Matrix(生成树 脑洞)的更多相关文章
- 【思维题 经典模型】cf632F. Magic Matrix
非常妙的经典模型转化啊…… You're given a matrix A of size n × n. Let's call the matrix with nonnegative elements ...
- CF 1042 E. Vasya and Magic Matrix
E. Vasya and Magic Matrix http://codeforces.com/contest/1042/problem/E 题意: 一个n*m的矩阵,每个位置有一个元素,给定一个起点 ...
- Educational Codeforces Round 9 F. Magic Matrix 最小生成树
F. Magic Matrix 题目连接: http://www.codeforces.com/contest/632/problem/F Description You're given a mat ...
- Codeforces 632F Magic Matrix(bitset)
题目链接 Magic Matrix 考虑第三个条件,如果不符合的话说明$a[i][k] < a[i][j]$ 或 $a[j][k] < a[i][j]$ 于是我们把所有的$(a[i][j ...
- codeforces 632F. Magic Matrix (最小生成树)
You're given a matrix A of size n × n. Let's call the matrix with nonnegative elements magic if it i ...
- codeforces 632F. Magic Matrix
题目链接 给一个n*n的矩阵, 问是否对角线上的元素全都为0, a[i][j]是否等于a[j][i], a[i][j]是否小于等于max(a[i][k], a[j][k]), k为任意值. 前两个都好 ...
- Codeforces 632F - Magic Matrix(暴力 bitset or Prim 求最小生成树+最小瓶颈路)
题面传送门 开始挖老祖宗(ycx)留下来的东西.jpg 本来想水一道紫题作为 AC 的第 500 道紫题的,结果发现点开了道神题. 首先先讲一个我想出来的暴力做法.条件一和条件二直接扫一遍判断掉.先将 ...
- CF1042E Vasya and Magic Matrix
感觉不会期望. 首先把所有格子按照权值从小到大排一下序,这样一共有$n * m$个元素,每个元素有三个属性$x, y, val$. 下文中的下标均为排序后的下标. 这样子我们就可以推出公式: $f_i ...
- Vasya and Magic Matrix CodeForces - 1042E (概率dp)
大意:给定n*m矩阵, 初始位置(r,c), 每一步随机移动到权值小于当前点的位置, 得分为移动距离的平方, 求得分期望. 直接暴力dp的话复杂度是O(n^4), 把距离平方拆开化简一下, 可以O(n ...
随机推荐
- 最简短的 AC 自动机!
写在前面 仍然是写给自己的,看不懂别怪我. 最简短的 AC 自动机! AC 自动机用于多模匹配. 模式串被插入一个添加了一些转移边的 Trie 中.在匹配的时候,若失配,则使下一个字符跳到该节点的 f ...
- PHP 中的闭包函数和匿名函数
闭包函数 闭包函数通常作为函数中的函数使用. <?php $foo = function($s) { echo $s; }; $foo('hello'); <?php function t ...
- 公网ip定位原理-心得
1.前言 正在做一个根据公网ip来定位到大体的位置,一般是精确到城市或地区, 如果想要精确到街道和地图一一对应,那得使用GPS才可以,这里不讨论. 2.科普 公网也就是外网,由运营商的机房服务器自动给 ...
- spring boot --- 使用 注解 读取 properties 文件 信息
1.前言 以前使用spring MVC框架 ,读取properties 配置文件需要写一大堆东西 ,也许 那时候 不怎么使用注解 ,现在使用spring boot ,发现了非常简便的办法---使用注解 ...
- 信不信由你!iPhone6屏幕宽度不一定是375px,iPhone6 Plus屏幕宽度不一定是414px
看到这个题目你可能不信,引出这个问题的缘由是几次项目中Chrome模拟器和iPhone6真机预览效果不一致. 为什么在Chrome Emulation模拟手机页面和真机预览效果不一致? 以前觉得不外乎 ...
- class、抽象类、接口区别
Java 抽象类 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类. 由于抽象类不 ...
- 使用idea时jsp中使用out.print();时报错的解决办法
在用Maven创建web项目时 在jsp页面中out.print();老是报错 这边print显示红色出错因为这边使用的是JSP的API并不是Servlet的,但是可以运行,所以我们只要导包就完事其实 ...
- 阿里Java规范:【强制】所有的 POJO 类属性必须使用包装数据类型
在 Java 开发手册中有这一条: 我们知道基本类型和包装类型有很多不同点: 封装类型可以调用各种方法,而基本类型没有 封装类型声明字段之后可以不设置默认值,而基本类型需要初始化默认值.比如 int ...
- 【自写信息搜集工具】ThunderSearch开发原理解析
前段时间结合zoomeye的开发文档做了个简易的信息搜集工具ThunderSearch[项目地址 / 博客地址],这次来讲讲具体的实现原理和开发思路 首先要能看懂开发文档,https://www.zo ...
- java多态概述特点转型I
1 package face_09; 2 3 import com.sun.jdi.Method; 4 5 /* 6 * 对象的多态性. 7 * class 动物 8 * {} 9 * 10 * cl ...