只要保存每相邻两行字符串 第一个不同位 即可。然后按照 第一个不同位上的字符有: " 来自下一行的 大于 来自上一行的" 构图,跑拓扑排序即可。

当然要判断一下有没有环构成, 有环一定是NO(可以思考一下)。

还可以提前判断下一行是不是上一行的前缀, 如果是,那么一定是NO。

在拓扑排序的过程中保存答案。

比如说对于 test9 :

10 10
8 1 1 6 10 2 2 9 7
6 2 7 1 9 5 10
1 5
7 3 6 9 6 3 7 6
10 3 9 10 3 6 7 10 6 9 6
10 4 4 9 8 2 10 3 6 2 9
8 4 8 6 4 6 4 8 6
2 7 5
6 8 6 2 1 9 8
3 10 2 10
可以得到相互关系:2 > 1,5 > 2,3 > 5,9 > 6,4 > 3,8 > 4,7 > 4,8 > 7,10 > 8。 在进行拓扑排序的过程中, 如果发现需要 2>3 这种情况时, 就要给3打上标记 , 在代码中我使用一个 f[3] 代表 3的实际值, 当3被
标记时, 直接 -2000000,以方便比较。
当然,如果在比较时发现,就算后面的元素加上了标记,依旧大于前面的 (f[v]>f[u]),此时直接No(这也意味着两个元素都被标记了);
#include <bits/stdc++.h>
using namespace std;
const int N = ;
int n, m, t, tt;
bool mark[N];
vector<int> a[N];
vector<int> b;
vector<int> G[N];
int f[N], in[N];
void out() {
puts("No");
exit();
}
void solve() {
for (int i = ; i <= m; i++) f[i] = i + ;//类似于一个映射函数,方便比较
for (int i = ; i < n; i++) {
bool flag = true;
int len = min(a[i - ].size(), a[i].size());
for (int j = ; j < len; j++) {
if (a[i - ][j] != a[i][j]) {
G[a[i][j]].push_back(a[i - ][j]);
in[a[i - ][j]]++;
flag = false;
break;
}
}
if (flag && a[i - ].size() > a[i].size()) {
out();//后一个是前一个的前缀
}
}
int cnt = ;
//拓扑排序开始
queue<int>q;
for (int i = ; i <= m; i++) {
if (in[i] == ) {
cnt++;
q.push(i);
}
}
while (!q.empty()) {
int u = q.front();
q.pop();
for (int i = ; i < G[u].size(); i++) {
int v = G[u][i];
in[v]--;
if (f[v] > f[u]) {
f[v] -= ; //等于加了个标记
mark[v] = true;
if (f[v] > f[u]) out(); //如果加了标记以后,还是小,那么NO
b.push_back(v);
}
if (!in[v]) {
cnt++;
q.push(v);
}
}
}
//拓扑排序结束
if (cnt < m) out(); //判断是不是所有元素的拓扑序都被判定了(判环)
puts("Yes");
cout << b.size() << endl;
for (int i = ; i < b.size(); i++) {
cout << b[i] << ' ';
} puts("");
}
int main() {
scanf("%d%d", &n, &m);
for (int i = ; i < n; i++) {
scanf("%d", &t);
for (int j = ; j < t; j++) {
scanf("%d", &tt);
a[i].push_back(tt);
}
}
solve();
return ;
}

CodeForces875C[拓扑排序] Codeforces Round #440 [Div2E/Div1C]的更多相关文章

  1. 拓扑排序 Codeforces Round #290 (Div. 2) C. Fox And Names

    题目传送门 /* 给出n个字符串,求是否有一个“字典序”使得n个字符串是从小到大排序 拓扑排序 详细解释:http://www.2cto.com/kf/201502/374966.html */ #i ...

  2. Codeforces Round #440 (Div. 2)【A、B、C、E】

    Codeforces Round #440 (Div. 2) codeforces 870 A. Search for Pretty Integers(水题) 题意:给两个数组,求一个最小的数包含两个 ...

  3. HDU4857——逃生(反向建图+拓扑排序)(BestCoder Round #1)

    逃生 Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b之前.同时,社会 ...

  4. codeforces Round #440 A Search for Pretty Integers【hash/排序】

    A. Search for Pretty Integers [题目链接]:http://codeforces.com/contest/872/problem/A time limit per test ...

  5. Codeforces Round #440 (Div. 2, based on Technocup 2018 Elimination Round 2)

    A. Search for Pretty Integers 题目链接:http://codeforces.com/contest/872/problem/A 题目意思:题目很简单,找到一个数,组成这个 ...

  6. Codeforces Round #440 (Div. 2, based on Technocup 2018 Elimination Round 2) D. Something with XOR Queries

    地址:http://codeforces.com/contest/872/problem/D 题目: D. Something with XOR Queries time limit per test ...

  7. [日常] Codeforces Round #440 Div.2 大力翻车实况

    上次打了一发ABC然后大力翻车...上午考试又停电+Unrated令人非常滑稽...下午终于到了CF比赛... 赛前大力安利了一发然后拉了老白/ $ljm$ / $wcx$ 一起打, 然后搞了个 TI ...

  8. Codeforces Round #440 Div. 1

    A:显然应该尽量拆成4.如果是奇数,先拆一个9出来即可. #include<iostream> #include<cstdio> #include<cmath> # ...

  9. Codeforces Round #440 (Div. 2) A,B,C

    A. Search for Pretty Integers time limit per test 1 second memory limit per test 256 megabytes input ...

随机推荐

  1. 生成.m文件的python代码中出现的错误

    错误代码 import tempfile import subprocess import shlex import os import numpy as np import scipy.io scr ...

  2. 踩坑日志!viser-ng的使用

    在ng-alian项目中使用viser图表库,在app.module中引用了viser-ng,然而,在具体的html项目中使用<v-chart>会报错,提示v-chart不是一个angul ...

  3. ES6 Promise用法详解

    What is Promise? Promise是一个构造函数,接受一个参数(Function),并且该参数接受两个参数resolve和reject(分别表示异步操作执行成功后的回调函数.执行失败后的 ...

  4. iOS开发——应用间跳转

    iOS开发过程中,我们经常碰到应用间跳转的情景: 1.使用第三方用户登录,跳转到需授权的App或跳转到分享app的对应页面 *需要用户授权,还需要"返回到调用的程序,同时返回授权的用户名.密 ...

  5. win10搭建FTP服务器

    下面就给大家讲解Win10搭建FTP服务器的详细操作方法. 1.首先,我们在Cortana中搜索控制面板并进入: 2.在控制面板-程序中,点击启用或关闭Windows功能: 3.在FTP服务器.Web ...

  6. 你所不知道的js的小知识点(1)

    1.js调试工具 debugger <div class="container"> <h3>debugger语句会产生一个断点,用于调试程序,并没有实际功能 ...

  7. 20180909 解析JS Cookie的设置,获取和检索

    引用: JavaScript Cookie - by runoob.com Cookie是储存在电脑文本文件中的数据,用于保存访问者的信息,并可以在下次打开页面时引用. 页面在设置/引用访问者信息时, ...

  8. jenkins重置build序号

    来源:https://www.jianshu.com/p/e342b52d45e1 执行命令:item = Jenkins.instance.getItemByFullName("your- ...

  9. java POI往word文档中指定位置插入表格

    1.Service  demo import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.a ...

  10. dynamic routing between captual

    对于人脑 决策树形式 对于CNN 层级与层级间的传递 人在识别物体的时候会进行坐标框架的设置 CNN无法识别,只能通过大量训练 胶囊 :一个神经元集合,有一个活动的向量,来表示物体的各类信息,向量的长 ...