Codeforces Round #541 (Div. 2) D(并查集+拓扑排序) F (并查集)
D. Gourmet choice
链接:http://codeforces.com/contest/1131/problem/D
思路: = 的情况我们用并查集把他们扔到一个集合,然后根据 > < 跑拓扑排序,根据拓扑排序的结果从小到大填数字就好了,需要注意的细节写在代码注释里了
代码:
#include<bits/stdc++.h>
using namespace std;
const int M = 2e3+;
int f[M],n,m;
set<int>st[M];
vector<int>v;
int vis[M];
map<int,int>ans;
bool flag;
string g[M];
int in[M];
int Find(int x){
if(x == f[x]) return x;
return f[x] = Find(f[x]);
} int Union(int x,int y){
int fx = Find(x);
int fy = Find(y);
if(fx != fy) f[fx] = fy;
} void Toposort(){
queue<int>q;
for(int i = ;i < n+m;i ++){
//同一个集合内的数如果之前已经出现过就跳过
if(vis[Find(i)]==) continue;
if(in[Find(i)] == ){
q.push(Find(i));
vis[Find(i)]=;
}
}
//因为要计数,所以多开一个vector存每一轮入度为0的点
int cnt = ;
while(!q.empty()){
v.clear();
while(!q.empty()){
v.push_back(q.front());
q.pop();
}
for(auto &i : v){
ans[i] = cnt;
for(auto &j : st[i]){
if(vis[j]==) continue;
in[j]--;
if(in[j] == ){
q.push(j);
vis[j]=;
}
}
}
cnt ++;
}
} int main()
{
cin>>n>>m;
flag = ;
for(int i = ;i < n+m;i ++) f[i] = i;
for(int i = ;i < n;i ++){
cin>>g[i];
for(int j = ;j < m;j ++){
if(g[i][j] == '='){
if(Find(i) != Find(n+j))
Union(i,n+j);
}
}
}
for(int i = ;i < n;i ++){
for(int j = ;j < m;j ++){
if(g[i][j] == '=') continue;
int x = Find(i),y = Find(n+j);
if(x == y) flag = ;
if(g[i][j] == '>') swap(x,y);
if(st[x].find(y) == st[x].end()){
st[x].insert(y);
in[y]++;
}
}
}
//如果一个集合内出现>或<,那么自相矛盾,输出No
if(!flag){
cout<<"No"<<endl;
return ;
}
Toposort();
//如果两个数 < > 关系矛盾,也就是i出现x>y且x<y,那么双方入度都无法为0,无法取值,
//所以如果值为0那么代表出现矛盾的情况输出N0
for(int i = ;i < n+m;i ++){
if(ans[Find(i)] == )
flag = ;
}
if(flag){
cout<<"Yes"<<endl;
for(int i = ;i < n;i ++)
cout<<ans[Find(i)]<<" ";
cout<<endl;
for(int i = n;i < n+m;i ++)
cout<<ans[Find(i)]<<" ";
cout<<endl;
}
else cout<<"No"<<endl;
return ;
}
F. Asya And Kittens
链接:http://codeforces.com/contest/1131/problem/F
思路:很容易发现房间合并的过程非常像并查集集合的合并,但是并查集合并并不能得到一段序列,所以我们用一个nex数组储存数字的前后关系,并用last数组记录集合最后的那个数,两个集合合并时,左边集合最后那个数的nex就是右边集合的第一个数,合并后整个集合的last就是右边集合的last,这样维护好两个数组,最后遍历一遍nex数组就可以得到一段符合要求的序列了。
实现代码:
#include<bits/stdc++.h>
using namespace std;
const int M = 2e5+;
int f[M],nex[M],last[M];
int Find(int x){
if(x == f[x]) return x;
return f[x] = Find(f[x]);
} int Union(int x,int y){
int fx = Find(x);
int fy = Find(y);
if(fx != fy) f[fy] = fx;
} int main()
{
int n,a,b;
cin>>n;
for(int i = ;i <= n;i ++)
last[i]=f[i]=i;
for(int i = ;i <= n-;i ++){
cin>>a>>b;
int fx = Find(a);
int fy = Find(b);
nex[last[fx]] = fy;
last[fx] = last[fy];
Union(a,b);
}
for(int i = Find();i;i=nex[i])
cout<<i<<" ";
return ;
}
Codeforces Round #541 (Div. 2) D(并查集+拓扑排序) F (并查集)的更多相关文章
- Codeforces Round #292 (Div. 1) B. Drazil and Tiles 拓扑排序
B. Drazil and Tiles 题目连接: http://codeforces.com/contest/516/problem/B Description Drazil created a f ...
- Codeforces Round #285 (Div. 1) A. Misha and Forest 拓扑排序
题目链接: 题目 A. Misha and Forest time limit per test 1 second memory limit per test 256 megabytes 问题描述 L ...
- Codeforces Round #292 (Div. 2) D. Drazil and Tiles [拓扑排序 dfs]
传送门 D. Drazil and Tiles time limit per test 2 seconds memory limit per test 256 megabytes Drazil cre ...
- Codeforces Round #660 (Div. 2) Captain Flint and Treasure 拓扑排序(按照出度、入读两边拓扑排序)
题目链接:Captain Flint and Treasure 题意: 一种操作为 选一个下标 使得ans+=a[i] 且 把a[b[i]]+a[i] 要求每个下标都进行一种这样的操作,问怎么样的 ...
- Codeforces Round #541 (Div. 2)
Codeforces Round #541 (Div. 2) http://codeforces.com/contest/1131 A #include<bits/stdc++.h> us ...
- Codeforces Round #541 (Div. 2) D 并查集 + 拓扑排序
https://codeforces.com/contest/1131/problem/D 题意 给你一个n*m二维偏序表,代表x[i]和y[j]的大小关系,根据表构造大小分别为n,m的x[],y[] ...
- Codeforces Round #396 (Div. 2) A B C D 水 trick dp 并查集
A. Mahmoud and Longest Uncommon Subsequence time limit per test 2 seconds memory limit per test 256 ...
- Codeforces Round #541 (Div. 2) (A~F)
目录 Codeforces 1131 A.Sea Battle B.Draw! C.Birthday D.Gourmet choice(拓扑排序) E.String Multiplication(思路 ...
- Codeforces 1131 F. Asya And Kittens-双向链表(模拟或者STL list)+并查集(或者STL list的splice()函数)-对不起,我太菜了。。。 (Codeforces Round #541 (Div. 2))
F. Asya And Kittens time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
随机推荐
- python代码风格指南:pep8 中文版
本文档所提供的编码规范,适用于主要的Python发行版中组成标准库的Python代码.请参阅PEP关于Python的C实现的C编码风格指南的描述. 本文档和PEP257(文档字符串规范)改编自Guid ...
- H5 26-CSS三大特性之优先级
26-CSS三大特性之优先级 类>标签>通配符>继承>浏览器默认 --> 0 我是段落 <!DOCTYPE html> <html lang=" ...
- mybatis入门 配置文件解释 及测试
这里介绍一下mybatis 根据mybatis的官网说明,mybatis是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置 ...
- Dijkstra的应用
每次只涉及一边两端点的极值循环转移应用Dijkstra.
- Python-类的特性(property)
什么是特性property property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值 例一:BMI指数(bmi是计算而来的,但很明显它听起来像是一个属性而非方法,如果我们将其做成一个 ...
- 295B - Greg and Graph (floyd逆序处理)
题意:给出任意两点之间的距离,然后逐个删除这些点和与点相连的边,问,在每次删除前的所有点对的最短距离之和 分析:首先想到的是floyd,但是如果从前往后处理,复杂度是(500)^4,超时,我们从后往前 ...
- 第十二届湖南省赛 (B - 有向无环图 )(拓扑排序+思维)好题
Bobo 有一个 n 个点,m 条边的有向无环图(即对于任意点 v,不存在从点 v 开始.点 v 结束的路径). 为了方便,点用 1,2,…,n 编号. 设 count(x,y) 表示点 x 到点 y ...
- 辨析element.offsetXxxx和element.style.xxxx
DOM操作时,经常使用element.style属性,没错,element.style是属性,和几个offsetXxxx属性一样,概念是一样的. 但是style有几个属性,这几个属性和offsetXx ...
- SpringMVC controller 时间 T
Spring MVC 之 处理Date类型 - carl.zhao的专栏 - CSDN博客https://blog.csdn.net/u012410733/article/details/727730 ...
- js文字从左边飞入效果
贴代码之前,我们先讲一下它的原理,我们使用setInterval,让文字一开始置于屏幕看不到的位置,左右上下都可以,然后让它的位置不断移入到屏幕看得到的位置. 下面上代码: html: <h2 ...