cf1131D
题意:总共有n+m个点,每一个点都有一个val,给出一个n*m的矩阵,矩阵中第i行第j列的为=,表示 i 点 和 j+n个点的值相等,<表示i 点比j+n个点的值小,> 刚好相反
要求用最少的值给每一个点确定一个val,满足如上那个矩阵,如果不存在输出Yes
存在输出每一个点的val
题解:大小关系可以转化为有向边,等于关系则是利用并查集进行缩点,因此value的分配可以利用拓扑排序来解决,如果存在环说明无解
具体细节看代码
int fa[maxn];
int Find(int x){
return fa[x]==x?x:fa[x]=Find(fa[x]);
}
int n,m;
char sym[1005][1005];
int id[maxn];
int head[maxn],ver[maxm],nex[maxm],tot;
void inline AddEdge(int x,int y){
ver[++tot]=y,nex[tot]=head[x],head[x]=tot;
}
int d[maxn];
bool vis[maxn];
int 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>>sym[i][j];
if(sym[i][j]=='=') {
int px=Find(i),py=Find(j+n);
if(px!=py){
fa[px]=py;
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(sym[i][j]=='<') {
AddEdge(Find(i),Find(j+n));
d[Find(j+n)]++;
}
else if(sym[i][j]=='>'){
AddEdge(Find(j+n),Find(i));
d[Find(i)]++;
}
}
}
queue<int> q;
for(int i=1;i<=n+m;i++)
if(!d[Find(i)]) q.push(Find(i));
while(q.size()){
int x=q.front();q.pop();
if(vis[x]) continue;
vis[x]=1;
for(int i=head[x];i;i=nex[i]){
int y=ver[i];
d[y]--;
id[y]=max(id[y],id[x]+1);
if(!d[y]) {
q.push(y);
}
}
}
for(int i=1;i<=n+m;i++)
if(d[Find(i)]) {
cout<<"No";
return 0;
}
puts("Yes");
for(int i=1;i<=n;i++)
cout<<id[Find(i)]+1<<' ';
cout<<endl;
for(int i=1;i<=m;i++)
cout<<id[Find(i+n)]+1<<' ';
cout<<endl;
}
cf1131D的更多相关文章
- CF1131D Gourmet choice
题目链接 题意 有两组菜,第一组有\(n\)种,第二组有\(m\)种.给出一个\(n\times m\)的矩阵,第\(i\)行第\(j\)列表示第一组中的第\(i\)种菜与第二组中的第\(j\)种菜好 ...
- CF1131D Gourmet choice(并查集,拓扑排序)
这题CF给的难度是2000,但我感觉没这么高啊…… 题目链接:CF原网 题目大意:有两个正整数序列 $a,b$,长度分别为 $n,m$.给出所有 $a_i$ 和 $b_j(1\le i\le n,1\ ...
- CF1131D tarjan,拓扑
题目链接 541div2 http://codeforces.com/contest/1131/problem/D 思路 给出n序列和m序列的相对大小关系 构造出最大值最小的序列 缩点+拓扑 小的向大 ...
- 拓扑排序+并查集——cf1131D
以前做过了忘记掉了..拓扑排序如果要处理等于关系,就要用并查集把相等关系进行缩点 /* 1.相等关系用并查集合并 2.不等关系用有向边链接 3.拓扑排序求顺序 */ #include<bits/ ...
- BZOJ3436: 小K的农场(差分约束裸题&DFS优化判环)
3436: 小K的农场 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2111 Solved: 986[Submit][Status][Discus ...
随机推荐
- 面试官:能解释一下javascript中bind、apply和call这三个函数的用法吗
一.前言 不知道大家还记不记得前几篇的文章:<面试官:能解释一下javascript中的this吗> 那今天这篇文章虽然是介绍javascript中bind.apply和call函数 ...
- 开源镜像站-Android镜像
mirrors.neusoft.edu.cn www.opencas.org ubuntu.buct.edu.cn Android developer 最新国内镜像:http://wear.techb ...
- ASP.NET Core on K8S 入门学习系列文章目录
一.关于这个系列 自从2018年底离开工作了3年的M公司加入X公司之后,开始了ASP.NET Core的实践,包括微服务架构与容器化等等.我们的实践是渐进的,当我们的微服务数量到了一定值时,发现运维工 ...
- Codeforces_797
学了一学期还是那么菜. 好久没更新,还是得放点东西的. A.贪心最小的素因子,k = 1时,直接输出n就可以了. #include<bits/stdc++.h> using namespa ...
- 计蒜客A1998 Ka Chang (分块+dfs序+树状数组)
题意 给你一个\(1e5\)的有点权的树,有\(1e5\)个操作: 1.给第\(x\)层的点加上\(y\) 2.求以\(x\)为根的子树的点权和 思路 首先处理出层数为x的所有点 操作2一般都是用df ...
- Codeforces Gym101234G Dreamoon and NightMarket(优先队列,子集和第k大)
题意: 求子集和第k大,n,k<=1e6 思路: 优先队列经典题目,注意优先队列是默认按从大到小排的 代码: #include<iostream> #include<cstdi ...
- 一起了解 .Net Foundation 项目 No.1
.Net 基金会中包含有很多优秀的项目,今天就和笔者一起了解一下其中的一些优秀作品吧. 中文介绍 中文介绍内容翻译自英文介绍,主要采用意译.如与原文存在出入,请以原文为准. Akka.NET Akka ...
- aliyun---经过LB到后端k8s压测超时的问题
环境:阿里云 压测主机:阿里云ECS(非LB后的主机) 压测目标:阿里云k8s自己的某个服务 k8s配置在kube-system 按照之前的ingress-nginx 配置了一个内网的ingress- ...
- 2Nginx+keepalive+2tomcat 故障转移
根据真实生产环境 总结. 硬件:共计2台Linux服务器 76和77 每台服务器都安装 Nginx Keepalive Tomcat80作为虚拟ip,负责对外连接. 78和79是两台mys ...
- c++头文件包含 #ifndef ##pragma once
2013-04-14 17:03 (分类:计算机程序) 烦死了,这种垃圾小问题很多,你又必须要知道.......在编写c++程序时,会编写多个类或者多个cpp文件,免不了要多次使用include包含头 ...