[CF1131D] Gourmet choice - 拓扑排序,并查集
时间:2020-03-26
本文章向大家介绍[CF1131D] Gourmet choice - 拓扑排序,并查集,主要包括[CF1131D] Gourmet choice - 拓扑排序,并查集使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
有两个正整数序列 \(a,b\),长度分别为 \(n,m\)。给出所有 \(a_i\) 和 \(b_j\) \((1\le i\le n,1\le j\le m)\) 的大小关系(大于,小于或者等于),请构造出符合条件的 \(a\) 和 \(b\)。如果无解,输出 NO
。如果有多个解,输出 \(a,b\) 中最大元素最小的方案。
Solution
并查集将所有等于的数合并起来,然后建图拓扑排序,最后 check
一下拓扑排序的结果以检查是否有环
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2005;
int n,m,g[N][N],fa[N],a[N],b[N];
char c[N][N];
int find(int p) {
return fa[p]==p ? p : fa[p]=find(fa[p]);
}
void merge(int p,int q) {
p=find(p); q=find(q);
if(p!=q) fa[p]=q;
}
void dfs(int p) {
b[p]=1;
for(int i=1;i<=n+m;i++) {
if(g[p][i]) {
if(b[i]) {
cout<<"No";
exit(0);
}
if(a[i]==0) dfs(i);
a[p]=max(a[p],a[i]);
}
}
b[p]=0;
++a[p];
}
signed main() {
cin>>n>>m;
for(int i=1;i<=n+m;i++) fa[i]=i;
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
cin>>c[i][j];
if(c[i][j]=='=') {
merge(i,n+j);
}
}
}
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
if(c[i][j]=='<') {
g[find(j+n)][find(i)]=1;
}
if(c[i][j]=='>') {
g[find(i)][find(j+n)]=1;
}
}
}
for(int i=1;i<=n+m;i++) if(a[i]==0) dfs(i);
cout<<"Yes"<<endl;
for(int i=1;i<=n;i++) cout<<a[find(i)]<<" ";
cout<<endl;
for(int i=1;i<=m;i++) cout<<a[find(i+n)]<<" ";
cout<<endl;
}
原文地址:https://www.cnblogs.com/mollnn/p/12573077.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Spring:AOP 面向切面编程
- JavaScript进阶教程(5)-一文让你搞懂作用域链和闭包
- JavaScript进阶教程(6)—硬核动图让你轻松弄懂递归与深浅拷贝
- Spring:JDBC Template,声明式事务
- Spring:讲解编程题
- SpringMVC:基本应用
- SpringMVC:进阶
- SpringMVC:SSM 整合
- 12 | Tornado源码分析:BaseIOStream 对象(上)
- 数据一致性校验及数据同步,运维必看
- Windows使用scoop包管理器安装RabbitMQ
- 深入理解web协议(二):DNS、WebSocket
- Elasticsearch:使用 function_score 及 soft_score 定制搜索结果的分数
- Elasticsearch:基于 Vector 的打分
- RocketMQ的发送模式和消费模式