2024/2/13 图的基础知识 3(拓扑排序)

目录

最长路

P1807 最长路 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

Divide by three, multiply by two

Problem - 977D - Codeforces


最长路

P1807 最长路 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路:使用拓扑排序,开两个二维数组,一个数组用来存边,另一个数组用来存边权

题目要求输出从1~n中的最长路,要从2~n遍历一边,删除其他入度为0的点所以要进两次queue

中间编译错误了好几次,编译错误的原因:数组越界或者参数传递出错

完整代码:

#include <bits/stdc++.h>
#define int long long
const int N = 1500 + 10;
std::vector<std::vector<int>> g(N);
std::vector<std::vector<int>> d(N);
int in[N];
int vis[N];
std::queue<int> q;
void bfs() {
    while (!q.empty()) {
        int cur = q.front();
        q.pop();
        for (int i = 0; i < g[cur].size(); i++) {
            int next = g[cur][i];
            in[next]--;
            if (in[next] == 0)
                q.push(next);
        }
    }
    q.push(1);
    while (!q.empty()) {
        int cur = q.front();
        q.pop();
        for (int i = 0; i < g[cur].size(); i++) {
            int next = g[cur][i];
            in[next]--;
            if (in[next] == 0)
                q.push(next);
            vis[next] = std::max(vis[next], vis[cur] + d[cur][i]);
        }
    }
}
signed main() {
    int n, m;
    std::cin >> n >> m;
    for (int i = 1; i <= m; i++) {
        int u, v, w;
        std::cin >> u >> v >> w;
        g[u].push_back(v);
        d[u].push_back(w);
        in[v]++;
    }
    for (int i = 2; i <= n; i++) {
        vis[i] = -1e9;
        if (in[i] == 0)
            q.push(i);
    }
    bfs();
    if (vis[n] == -1e9)
        std::cout << -1;
    else
        std::cout << vis[n];
    return 0;
}

Divide by three, multiply by two

Problem - 977D - Codeforces

思路: 拓扑排序

以{4,8,6,3,12,9}为例

可以发现符合题目的有这些:

{4,8}

{3,6}

{6,12}

{9,3}

{12,4}

可以发现,9前面没有连着的数,即入度为0,由于数据很大,所以不能直接暴力存图,存下标就可以了

完整代码:

#include <bits/stdc++.h>
#define int long long
const int N = 110;
std::vector<std::vector<int>> g (N);
int in[10000010];
int a[N];
int n;
std::queue<int> q;
void bfs()
{
    for(int i = 1;i <= n;i ++)
    {
        if(in[i]==0)
            q.push(i);
    }
    while(!q.empty())
    {
        int cur=q.front();
        q.pop();
        std::cout<<a[cur]<<" ";
        for(int i = 0;i < g[cur].size();i ++)
        {
            int next=g[cur][i];
            in[next]--;
            if(in[next]==0)
                q.push(next);
        }
    }
}
signed main()
{
    memset(in,0,sizeof(in));
    std::cin >> n;
    for(int i = 1;i <= n;i ++)
    {
        std::cin >> a[i];
    }
    for(int i = 1;i <= n;i ++)
    {
        for(int j = 1;j <= n;j ++)
        {
            if(a[i]*2==a[j]||(a[i]%3==0&&a[i]/3==a[j]))
            {
                g[i].push_back(j);
                in[j]++;
            }
        }
    }
    bfs();
    return 0;
}

相关推荐

  1. 2024/2/13 基础知识 3拓扑排序)

    2024-02-14 15:50:01       56 阅读
  2. 算法——论:拓扑排序

    2024-02-14 15:50:01       47 阅读
  3. 848. 有向拓扑序列(拓扑排序模板题)

    2024-02-14 15:50:01       63 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-14 15:50:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-14 15:50:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-02-14 15:50:01       87 阅读
  4. Python语言-面向对象

    2024-02-14 15:50:01       96 阅读

热门阅读

  1. AcWing 1233. 全球变暖(bfs块问题)

    2024-02-14 15:50:01       49 阅读
  2. STM32自学☞PWM驱动LED呼吸灯

    2024-02-14 15:50:01       46 阅读
  3. C# 声音处理库Naudio介绍

    2024-02-14 15:50:01       47 阅读
  4. 利用函数我们计算某年某月有多少天?

    2024-02-14 15:50:01       47 阅读
  5. 车载常见概念

    2024-02-14 15:50:01       56 阅读
  6. 11 基础应用题公式

    2024-02-14 15:50:01       51 阅读
  7. 街舞公司小程序的设计与实现计算机毕设

    2024-02-14 15:50:01       50 阅读
  8. 社区医疗服务小程序的设计与实现毕业设计源码

    2024-02-14 15:50:01       42 阅读