1.练习项目  :

走多远

题目描述

给定一个 n 个点,m​ 条边的有向无环图,小明从入度为 0 点出发,顺着边最远能走多远,若不存在这样的点,输出 0。

输入描述

第一行输入一个 n,m​​ 。

接下来 m 行,每行输入俩个整数 u,v 代表有一条有向边从 u 到 v​.

1≤n,m≤106,1≤u,v≤n​

输出描述

输出一个整数表示最长距离。

2.选择课程

在蓝桥云课中选择题库,选择题号1337并开始练习。

3.开始练习

(1)源码     :

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e6+10;

int n,m,ind[N],dp[N];
vector<int>g[N];

void topu()
{
    queue<int>q;
    //找所有起点
    for(int i=1;i<=n;i++)if(!ind[i])q.push(i);
    
    //只要队列不为空,就持续扩展
    while(!q.empty()){
        
        //取出队头元素,并pop掉
        int x=q.front();q.pop();
        for(const auto&y:g[x]){
            dp[y]=max(dp[y],dp[x]+1);
            if(--ind[y]==0)q.push(y);
        }
    }
}

int main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        int x,y;cin>>x>>y;
        ind[y]++;
        g[x].push_back(y);
    }
    topu();
    int ans=0;
    for(int i=1;i<=n;i++)ans=max(ans,dp[i]);
    cout<<ans<<'\n';
    return 0;
}

(2)检验结果

对此代码进行检验,检验后无报错,提交此代码,判题结果为正确100分。

(3)练习心得:注意每段代码末尾的分号是否存在   ,如不存在则需即使补充;输入法   是否切换 为英语模式;语法是否错误。

更多推荐