D. Gourmet choice

time limit per test

2 seconds

memory limit per test

256 megabytes

 
题目链接:

Discribe

Mr. Apple, a gourmet, works as editor-in-chief of a gastronomic periodical. He travels around the world, tasting new delights of famous chefs from the most fashionable restaurants. Mr. Apple has his own signature method of review  — in each restaurant Mr. Apple orders two sets of dishes on two different days. All the dishes are different, because Mr. Apple doesn't like to eat the same food. For each pair of dishes from different days he remembers exactly which was better, or that they were of the same quality. After this the gourmet evaluates each dish with a positive integer.

Once, during a revision of a restaurant of Celtic medieval cuisine named «Poisson», that serves chestnut soup with fir, warm soda bread, spicy lemon pie and other folk food, Mr. Apple was very pleasantly surprised the gourmet with its variety of menu, and hence ordered too much. Now he's confused about evaluating dishes.

The gourmet tasted a set of n

dishes on the first day and a set of m dishes on the second day. He made a table a of size n×m, in which he described his impressions. If, according to the expert, dish i from the first set was better than dish j from the second set, then aij is equal to ">", in the opposite case aij is equal to "<". Dishes also may be equally good, in this case aij

is "=".

Now Mr. Apple wants you to help him to evaluate every dish. Since Mr. Apple is very strict, he will evaluate the dishes so that the maximal number used is as small as possible. But Mr. Apple also is very fair, so he never evaluates the dishes so that it goes against his feelings. In other words, if aij

is "<", then the number assigned to dish i from the first set should be less than the number of dish j from the second set, if aij is ">", then it should be greater, and finally if aij

is "=", then the numbers should be the same.

Help Mr. Apple to evaluate each dish from both sets so that it is consistent with his feelings, or determine that this is impossible.

Input

The first line contains integers n

and m (1≤n,m≤1000

) — the number of dishes in both days.

Each of the next n

lines contains a string of m symbols. The j-th symbol on i-th line is aij

. All strings consist only of "<", ">" and "=".

Output

The first line of output should contain "Yes", if it's possible to do a correct evaluation for all the dishes, or "No" otherwise.

If case an answer exist, on the second line print n

integers — evaluations of dishes from the first set, and on the third line print m

integers — evaluations of dishes from the second set.

Examples
Input
3 4
>>>>
>>>>
>>>>
Output
Yes
2 2 2
1 1 1 1
Input
3 3
>>>
<<<
>>>
Output
Yes
3 1 3
2 2 2
Input
3 2
==
=<
==
Output
No
Note

In the first sample, all dishes of the first day are better than dishes of the second day. So, the highest score will be 2

, for all dishes of the first day.

In the third sample, the table is contradictory — there is no possible evaluation of the dishes that satisfies it.

题意

有两个点集分别有n个点和m个点,告诉你第一个集合里的所有点的权值和第二个集合里的所有点的权值的大小关系。

问是否能给每个点赋一个值,使得满足题目所给的大小关系,如果可以,输出任意一组合法解。

题解:

对于任意两个点ai和bj,如果ai<bj则,连一条从j到i的单向边,问题即为每个点的最长路。

如果相等,我们缩点即可。如果有环则说明无解。

具体步骤:

先缩点,再判环,我直接tarjan求环,然后再在DAG上dfs求最长路即可。

Debug:

1.一开始先不管相等的边,判环再缩点,导致可能缩点之后又有新的环产生。

2.一看n<1000,平时做多了n和边是一个数量级的题目,于是边只开了10000,还以为够了,真是惯性思维惹的祸,还是太菜了。

代码:

 #include<bits/stdc++.h>
using namespace std;
#define N 2000050
char road[][];
int n,m,fa[N],f[N],ans[N];
bool flag=;
struct Edge{int from,to,s;}edges[N<<],edges2[N<<];
int tot,last[N];
template<typename T>void read(T&x)
{
int k=;char c=getchar();
x=;
while(!isdigit(c)&&c!=EOF)k^=c=='-',c=getchar();
if(c==EOF)exit();
while(isdigit(c))x=x*+c-'',c=getchar();
x=k?-x:x;
}
void read_char(char &c)
{while((c=getchar())!='<'&&c!='>'&&c!='='&&c!=EOF);}
int gf(int x)
{
if (x==fa[x])return x;
fa[x]=gf(fa[x]);
return fa[x];
}
void AddEdge(int x,int y)
{
edges[++tot]=Edge{x,y,last[x]};
last[x]=tot;
}
int low[N],dfn[N],sk[N],at_sk[N],top,Time;
void tarjan(int x)
{
dfn[x]=++Time;
low[x]=Time;
sk[++top]=x;
at_sk[x]=;
f[x]=;
for(int i=last[x];i;i=edges[i].s)
{
Edge &e=edges[i];
if (gf(x)==gf(e.to))flag=true;
if (!f[e.to])tarjan(e.to);
if (at_sk[e.to])low[x]=min(low[x],low[e.to]);
}
if (sk[top]!=x)flag=true;
if (low[x]==dfn[x])
{
while(sk[top+]!=x&&top)
at_sk[sk[top--]]=;
}
}
void dfs(int x)
{
f[x]=;
ans[x]=;
for(int i=last[x];i;i=edges[i].s)
{
Edge &e=edges[i];
if(!ans[e.to]&&!f[e.to])dfs(e.to);
ans[x]=max(ans[x],ans[e.to]);
}
ans[x]++;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("aa.in","r",stdin);
#endif
read(n);read(m);
char c;
for(int i=;i<=n+m+n;i++)fa[i]=i;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
read_char(c);
//if (c=='<')AddEdge(j+n,i);
//if (c=='>')AddEdge(i,j+n);
road[i][j]=c;
if (c=='=')fa[gf(i)]=gf(j+n);
}
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if (road[i][j]=='<')AddEdge(gf(j+n),gf(i));
else if (road[i][j]=='>')AddEdge(gf(i),gf(j+n)); for(int i=;i<=n+m;i++) if(!f[gf(i)]&&!flag)tarjan(gf(i));
if (flag)
{
printf("No");
return ;
}
printf("Yes\n");
memset(f,,sizeof(f));
for(int i=;i<=n+m;i++) if (!f[gf(i)]) dfs(gf(i));
for(int i=;i<=n;i++) printf("%d ",ans[gf(i)]);
putchar('\n');
for(int i=;i<=m;i++) printf("%d ",ans[gf(i+n)]);
}

coderfoces D. Gourmet choice的更多相关文章

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

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

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

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

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

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

  4. CF1131D Gourmet choice

    题目链接 题意 有两组菜,第一组有\(n\)种,第二组有\(m\)种.给出一个\(n\times m\)的矩阵,第\(i\)行第\(j\)列表示第一组中的第\(i\)种菜与第二组中的第\(j\)种菜好 ...

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

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

  6. 【CF #541 D】 Gourmet choice

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

  7. CF - 1131 D Gourmet choice

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

  8. CF#541 D. Gourmet choice /// BFS 拓扑

    题目大意: 给定n m 第一行有n个数 第二行有m个数 接下来n行每行m列 有 = < > 位于 i j 的符号表示 第一行第i个数与第二行第j个数的大小关系 1.将n+m个数 当做按顺序 ...

  9. Codeforces Round #541 (Div. 2) D(并查集+拓扑排序) F (并查集)

    D. Gourmet choice 链接:http://codeforces.com/contest/1131/problem/D 思路: =  的情况我们用并查集把他们扔到一个集合,然后根据 > ...

随机推荐

  1. Python 调用阿里云 API 收集 ECS 数据

    #!/usr/bin/env python # coding: utf-8 # author: Wang XiaoQiang ''' 功能介绍: 1.调用阿里云API,收集所有区域 ECS 信息 2. ...

  2. Elasticsearch-PHP 处理JSON数组和对象

    PHP中处理JSON数组和对象 客户端有一些混淆的资源是围绕着JSON的数组和对象,以及如何在PHP中指定它们.特别是,问题是由空对象和空数组导致的.这篇文章回告诉你一些在Elasticsearch ...

  3. T-SQL 重复读(Double Read)问题的理解

    我的理解是: step1,假设表里有100行有序记录, 事务1从row 1 开始读取到了row 50 并准备继续读取完这100行. 要注意的是,sql server 会自动释放已经读取了的row的锁. ...

  4. mysqldump test

    CREATE TABLE IF NOT EXISTS `runoob_tbl`( `runoob_id` INT UNSIGNED AUTO_INCREMENT, `runoob_title` VAR ...

  5. Android——eclipse共享library以及导出jar包[转]

    目录(?)[-] 一apk之间共享Class 二apk导出jar包   android的apk在在eclipse上进行开发的时候,有时候需要import其它包中的一些class,正常的方法就是在jav ...

  6. poi解析excle文件(xls,xlsx)

    解析xls文件 /** * 解析xls文件 * * @param path 文件路径 * @throws Exception */ public static void showXls(String ...

  7. 关于C++中不同类之间的赋值问题——存疑

    operator=不能重载为全局函数.理由如下 void operator=(int i , A& a) {  a.a = i } ; 那么将会出现 99 = a 这种代码,但是99不是左值, ...

  8. python处理Excel 之 xlrd-乾颐堂

    python处理Excel常用到的模块是xlrd.使用xlrd可以非常方便的处理Excel文档,下面介绍一下基本用法 1.打开文件 import xlrd data= xlrd.open_workbo ...

  9. [Excel]鼠标右键菜单没有新建Word、Excel、PPT怎么办?

    很多朋友在安装好Office(2010或2013等)之后,发现右键新建中没有Word.Excel.PowerPoint等项,但是自己的Office却明明安装好了.这个时候该怎么办呢?这里,本文为大家提 ...

  10. 【转】C语言中DEFINE简介及多行宏定义

    要写好C语言,漂亮的宏定义是非常重要的.宏定义可以帮助我们防止出错,提高代码的可移植性和可读性等. 在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成为宏定 ...