【PAT甲级】1146 Topological Order

简介: 【PAT甲级】1146 Topological Order

1146 Topological Order

This is a problem given in the Graduate Entrance Exam in 2018: Which of the following is NOT a topological order obtained from the given directed graph? Now you are supposed to write a program to test each of the options.

Input Specification:

Each input file contains one test case. For each case, the first line gives two positive integers N (≤ 1,000), the number of vertices in the graph, and M (≤ 10,000), the number of directed edges. Then M lines follow, each gives the start and the end vertices of an edge. The vertices are numbered from 1 to N. After the graph, there is another positive integer K (≤ 100). Then K lines of query follow, each gives a permutation of all the vertices. All the numbers in a line are separated by a space.


Output Specification:

Print in a line all the indices of queries which correspond to “NOT a topological order”. The indices start from zero. All the numbers are separated by a space, and there must no extra space at the beginning or the end of the line. It is graranteed that there is at least one answer.


Sample Input:

6 8
1 2
1 3
5 2
5 4
2 3
2 6
3 4
6 4
6
5 2 3 6 4 1
1 5 2 3 6 4
5 1 2 6 3 4
5 1 2 3 6 4
5 2 1 6 3 4
1 2 3 4 5 6


Sample Output:

0 4 5


题意

给定一个有向图,并给定多个序列,需要我们判断这些序列是否是拓扑序列,将不是拓扑序列的询问编号输出,询问编号从 0 开始。


拿题目样例来看,序列 [5 2 1 6 3 2] 之所以不是拓扑序列,是因为其中 2->1 方向反了。


图中只有 1->2 的边但没有 2->1 的边,不能出现逆向边,也就是每条边的前面那个点在序列中的位置必须在后面那个点的位置之前。


思路

我们可以通过记录给定序列每个元素对应的下标,然后去判断每条边的两个端点的下标大小,如果是拓扑序列,则每条边 a->b 中 a 在序列中的下标必须比 b 在序列中的下标小,即 a 在序列中的位置必须在 b 之前,否则就不是一个拓扑序列。


假设还是样例中的那张图,现在给定一个序列 [5 2 3 6 4 1] ,可以找到一条边 1->2 ,发现 1 在序列中的第 6 位,而 2 却在第 2 位,即 1 出现在了 2 的后面,所以该序列不是拓扑序列。


另外需要注意的是,输出的询问编号是从 0 开始,并且输出的末尾不能出现空格。


代码

#include<bits/stdc++.h>
using namespace std;
const int N = 1010, M = 10010;
struct Edge {
    int a, b;
}e[M];
int p[N];
int main()
{
    int n, m;
    cin >> n >> m;
    //输入每条有向边
    for (int i = 0; i < m; i++)    cin >> e[i].a >> e[i].b;
    //开始查询
    bool is_first = true; //输出行末不能有空格
    int k;
    cin >> k;
    for (int i = 0; i < k; i++)
    {
        //输入每个序列
        for (int j = 1; j <= n; j++)
        {
            int x;
            cin >> x;
            p[x] = j; //记录每个点所在序列下标
        }
        //遍历每条边,判断是否都满足拓扑序列规则
        bool success = true;
        for (int i = 0; i < m; i++)
            if (p[e[i].a] > p[e[i].b])
            {
                success = false;
                break;
            }
        //输出不是拓扑序列的询问编号
        if (!success)
        {
            if (is_first)    is_first = false;
            else    cout << " ";
            cout << i;
        }
    }
    cout << endl;
    return 0;
}


目录
相关文章
|
1天前
|
云安全 监控 安全
|
7天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
844 5
|
12天前
|
人工智能 Java API
Java 正式进入 Agentic AI 时代:Spring AI Alibaba 1.1 发布背后的技术演进
Spring AI Alibaba 1.1 正式发布,提供极简方式构建企业级AI智能体。基于ReactAgent核心,支持多智能体协作、上下文工程与生产级管控,助力开发者快速打造可靠、可扩展的智能应用。
1072 40
|
8天前
|
机器学习/深度学习 人工智能 数据可视化
1秒生图!6B参数如何“以小博大”生成超真实图像?
Z-Image是6B参数开源图像生成模型,仅需16GB显存即可生成媲美百亿级模型的超真实图像,支持中英双语文本渲染与智能编辑,登顶Hugging Face趋势榜,首日下载破50万。
632 37
|
12天前
|
人工智能 前端开发 算法
大厂CIO独家分享:AI如何重塑开发者未来十年
在 AI 时代,若你还在紧盯代码量、执着于全栈工程师的招聘,或者仅凭技术贡献率来评判价值,执着于业务提效的比例而忽略产研价值,你很可能已经被所谓的“常识”困住了脚步。
699 60
大厂CIO独家分享:AI如何重塑开发者未来十年
|
8天前
|
存储 自然语言处理 测试技术
一行代码,让 Elasticsearch 集群瞬间雪崩——5000W 数据压测下的性能避坑全攻略
本文深入剖析 Elasticsearch 中模糊查询的三大陷阱及性能优化方案。通过5000 万级数据量下做了高压测试,用真实数据复刻事故现场,助力开发者规避“查询雪崩”,为您的业务保驾护航。
447 28
|
15天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
922 59
Meta SAM3开源:让图像分割,听懂你的话
|
5天前
|
弹性计算 网络协议 Linux
阿里云ECS云服务器详细新手购买流程步骤(图文详解)
新手怎么购买阿里云服务器ECS?今天出一期阿里云服务器ECS自定义购买流程:图文全解析,阿里云服务器ECS购买流程图解,自定义购买ECS的设置选项是最复杂的,以自定义购买云服务器ECS为例,包括付费类型、地域、网络及可用区、实例、镜像、系统盘、数据盘、公网IP、安全组及登录凭证详细设置教程:
202 114