C++课后习题训练记录Day141
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)练习心得:注意每段代码末尾的分号是否存在 ,如不存在则需即使补充;输入法 是否切换 为英语模式;语法是否错误。
更多推荐
所有评论(0)