【洛谷 P3916】图的遍历 题解(图论+深度优先搜索)
  VJeqq9jk2lCR 2023年11月02日 16 0

图的遍历

题目描述

给出 【洛谷 P3916】图的遍历 题解(图论+深度优先搜索)_数据 个点,【洛谷 P3916】图的遍历 题解(图论+深度优先搜索)_数据_02 条边的有向图,对于每个点 【洛谷 P3916】图的遍历 题解(图论+深度优先搜索)_#include_03,求 【洛谷 P3916】图的遍历 题解(图论+深度优先搜索)_数据_04 表示从点 【洛谷 P3916】图的遍历 题解(图论+深度优先搜索)_#include_03 出发,能到达的编号最大的点。

输入格式

【洛谷 P3916】图的遍历 题解(图论+深度优先搜索)_i++_06【洛谷 P3916】图的遍历 题解(图论+深度优先搜索)_数据_07 个整数 【洛谷 P3916】图的遍历 题解(图论+深度优先搜索)_#include_08,表示点数和边数。

接下来 【洛谷 P3916】图的遍历 题解(图论+深度优先搜索)_数据_02 行,每行 【洛谷 P3916】图的遍历 题解(图论+深度优先搜索)_数据_07 个整数 【洛谷 P3916】图的遍历 题解(图论+深度优先搜索)_数据_11,表示边 【洛谷 P3916】图的遍历 题解(图论+深度优先搜索)_#include_12。点用 【洛谷 P3916】图的遍历 题解(图论+深度优先搜索)_#include_13 编号。

输出格式

一行 【洛谷 P3916】图的遍历 题解(图论+深度优先搜索)_数据 个整数 【洛谷 P3916】图的遍历 题解(图论+深度优先搜索)_数据_15

样例 #1

样例输入 #1

4 3
1 2
2 4
4 3

样例输出 #1

4 4 3 4

提示

  • 对于 【洛谷 P3916】图的遍历 题解(图论+深度优先搜索)_数据_16 的数据,【洛谷 P3916】图的遍历 题解(图论+深度优先搜索)_i++_17
  • 对于 【洛谷 P3916】图的遍历 题解(图论+深度优先搜索)_#include_18 的数据,【洛谷 P3916】图的遍历 题解(图论+深度优先搜索)_#include_19

思路

储存图时反向存储,即将边的起点和终点对调。然后从最大编号的节点开始对图进行反向遍历,所能到达的节点的所求值即起点的值。

AC代码

#include <iostream>
#include <cstring>
using namespace std;
#define AUTHOR "HEX9CF"

const int maxn = 100005;

int cnt = 0;
int maxi[maxn];

// 链式前向星
struct Sedge
{
    int to;
    int next;
} edge[maxn];
int head[maxn];

void add(int u, int v)
{
    edge[cnt].to = v;
    edge[cnt].next = head[u];
    head[u] = cnt++;
}

void dfs(int x, int ori)
{
    if (maxi[x])
    {
        return;
    }
    maxi[x] = ori;
    for (int i = head[x]; ~i; i = edge[i].next)
    {
        dfs(edge[i].to, ori);
    }
}

void read(int &x)
{
    char ch;
    x = 0;
    while (!('0' <= ch && '9' >= ch))
    {
        ch = getchar();
    }
    while (('0' <= ch && '9' >= ch))
    {
        x = x * 10 + ch - '0';
        ch = getchar();
    }
}

int main()
{
    int n, m;
    int a, b;
    memset(head, -1, sizeof(head));
    memset(maxi, 0, sizeof(maxi));
    read(n);
    read(m);
    for (int i = 1; i <= m; i++)
    {
        read(a);
        read(b);
        add(b, a); // 反向添加边
    }
    for (int i = n; i; i--)
    {
        // 反向搜索
        dfs(i, i);
    }
    for (int i = 1; i <= n; i++)
    {
        cout << maxi[i];
        if (i != n)
        {
            cout << " ";
        }
    }
    return 0;
}
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
VJeqq9jk2lCR