题目大意:

给定n m 第一行有n个数 第二行有m个数

接下来n行每行m列 有 = < >

位于 i j 的符号表示 第一行第i个数与第二行第j个数的大小关系

1.将n+m个数 当做按顺序编号的点

则第二行的数是编号为 n+j 的点

2.先处理=的数 将所有=的数指向同一个父亲

3.再处理不是=的数

找到两者的父亲

如果父亲相同说明两者= 与目前处理的情况相悖 无解

否则 按由小到大的关系在两者(的父亲)间连单向边(小连向大) 此时较大的点入度+1

4.此时查看所有点的入度

入度为0 说明这个点是所有数中最小的数

将它们的答案设为1 放进队列

5.广搜 取出队列里的点

判断是否能去向下一个点 能到的点数值比当前点大

所以 它们的答案 是 当前点的答案+1

6.查看对应点的答案 应该查询 这个点的父亲(数值相等) 的答案

因为连边时 实际上是在对应点的父亲之间连的边

#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f
#define mem(i,j) memset(i,j,sizeof(i))
#define inc(i,l,r) for(int i=l;i<=r;i++)
#define dec(i,r,l) for(int i=r;i>=l;i--)
const int N=1e3+;
const int NN=N<<;
const int mod=1e9+; int n, m;
char G[N][N];
int E[NN][NN];
int du[NN], ans[NN];
int fa[NN];
int getfa(int x) {
if(fa[x]==x) return x;
else return fa[x]=getfa(fa[x]);
}
int main()
{
while(~scanf("%d%d",&n,&m)) {
inc(i,,n) scanf("%s",G[i]+);
inc(i,,n+m) fa[i]=i;
inc(i,,n) inc(j,,m) // 第二行的编号为n+j
if(G[i][j]=='=') fa[getfa(i)]=getfa(n+j);
// 相等的连到同一个父亲
bool OK=; mem(E,); mem(du,);
inc(i,,n) inc(j,,m)
if(G[i][j]!='=') {
int fi=getfa(i), fj=getfa(n+j);
// 父亲相同说明相等 但此时是不等的情况 则无解
if(fi==fj) OK=;
else {
if(G[i][j]=='<'&&E[fi][fj]==)
E[fi][fj]=, du[fj]++;
else if(G[i][j]=='>'&&E[fj][fi]==)
E[fj][fi]=, du[fi]++;
} // 由小向大连边 并计算点的入度
}
if(OK==) { puts("No"); continue; }
queue<int>q;
inc(i,,n+m) // 入度为0说明是最小的
if(du[i]==) q.push(i), ans[i]=;
while(!q.empty()) {
int u=q.front(); q.pop();
inc(i,,n+m)
if(E[u][i] && --du[i]==) // 入度减1 即去掉u点
q.push(i), ans[i]=ans[u]+;
// 入度减为0说明没有比他更小的了
}
inc(i,,n+m) if(du[i]) OK=;
if(OK==) { puts("No"); continue; }
puts("Yes");
inc(i,,n) printf("%d ",ans[getfa(i)]); printf("\n");
inc(i,,m) printf("%d ",ans[getfa(n+i)]); printf("\n");
} return ;
}

CF#541 D. Gourmet choice /// BFS 拓扑的更多相关文章

  1. Codeforces #541 (Div2) - D. Gourmet choice(拓扑排序+并查集)

    Problem   Codeforces #541 (Div2) - D. Gourmet choice Time Limit: 2000 mSec Problem Description Input ...

  2. codeforces #541 D. Gourmet choice(拓扑+并查集)

    Mr. Apple, a gourmet, works as editor-in-chief of a gastronomic periodical. He travels around the wo ...

  3. CF - 1131 D Gourmet choice

    题目传送门 先把 = 的人用并查集合并在一起. 然后 < > 的建边, 跑一遍 toposort 之后就好了. 入度为0点的值肯定为1, 然后就是因为这个是按照时间线走过来的,所以一个点的 ...

  4. D. Gourmet choice并查集,拓扑结构

    D. Gourmet choice time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  5. coderfoces D. Gourmet choice

      D. Gourmet choice time limit per test 2 seconds memory limit per test 256 megabytes   题目链接: https: ...

  6. 【CF #541 D】 Gourmet choice

    link:https://codeforces.com/contest/1131 题意: 给定一些大小比较,输出排名. 思路: 这道题我用的是拓扑排序,又因为有等于号的存在,我用了并查集. 结束后这道 ...

  7. CF1131D Gourmet choice(并查集,拓扑排序)

    这题CF给的难度是2000,但我感觉没这么高啊…… 题目链接:CF原网 题目大意:有两个正整数序列 $a,b$,长度分别为 $n,m$.给出所有 $a_i$ 和 $b_j(1\le i\le n,1\ ...

  8. CF #375 (Div. 2) D. bfs

    1.CF #375 (Div. 2)  D. Lakes in Berland 2.总结:麻烦的bfs,但其实很水.. 3.题意:n*m的陆地与水泽,水泽在边界表示连通海洋.最后要剩k个湖,总要填掉多 ...

  9. CF 520 B. Two Buttons(bfs)

    /*题意:一个数,就是输入的第一个数,让它变成第二个数最少用几步.可以点红色按钮,蓝色按钮来改变数字,红色:*2,蓝色:-1,如果变成负数,就变成原来的数.CF 520 B. Two Buttons思 ...

随机推荐

  1. python学习笔记:模块——xpinyin(拼音)、hashlib(加密)

    1.下载安装模块 cmd下执行命令下载安装:pip install xpinyin cmd下执行命令下载安装:pip install hashlib 2.xpinyin模块(拼音) from xpin ...

  2. Django 模型中的CRUD

    一.通过 ORM 向 DB 中增加数据 1.Entry.objects.create(属性=值,属性=值) Entry:具体要操作的Model类 ex: Author.objects.create(n ...

  3. spark textFile读取多个文件

    1.spark textFile读取File 1.1 简单读取文件 val spark = SparkSession.builder() .appName("demo") .mas ...

  4. windows下虚拟环境的安装与创建

    使用虚拟环境的好处: 可以方便的解决不同项目对类库的依赖问题. 可以在系统中Python解释器中避免包的混乱和版本的冲突. 为每个程序单独创建虚拟环境,可以保证程序只能访问虚拟环境中的包,保持全局解释 ...

  5. 面向对象&从这里开始我们将不再是纯小白

    一.面向对象初识 1.1 面向过程编程vs函数式编程 我们在没有学习函数的时候,写的代码都是面向过程式编程 # 面向过程编程 测量对象的元素的个数. s1 = 'fjdsklafsjda' count ...

  6. 38-python基础-python3-检查字典中是否存在键或值

    in 和 not in 操作符   请注意, 在前面的例子中,‘name’ in spam 本质上是一个简写版本.相当于'name' in spam.keys()

  7. sysprep

    今天做虚拟机模板,以及克隆.单纯的克隆会造成很多冲突问题的产生,所以在这里,windows自带的sysprep功能很好的解决了这一点. 路径位于:C:\Windows\System32\Sysprep ...

  8. python 正则匹配

    正则表达式模式 模式字符串使用特殊的语法来表示一个正则表达式: 字母和数字表示他们自身.一个正则表达式模式中的字母和数字匹配同样的字符串. 多数字母和数字前加一个反斜杠时会拥有不同的含义. 标点符号只 ...

  9. Windows API 查看器

    { http://www.dependencywalker.com/ } { Download the latest version here:  Download Version 2.2.6000 ...

  10. Dart编程实例 - Const 关键字

    Dart编程实例 - Const 关键字 void main() { final v1 = 12; const v2 = 13; v2 = 12; } 本文转自:http://codingdict.c ...