题目大意:给定一个有向无环图(DAG),问在这个图中最长的一段路径的长度为多少
思路:与洛谷P1137题相同,按照节点的拓扑序进行状态转移,可以保证结果的正确性。
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
vector<int> g[N];
int f[N],in[N];
int ans;
int n,m;
void bfs()//类似拓扑排序
{
queue<int> q;
for(int i=1;i<=n;i++){
if(in[i]==0) q.push(i);
//如果入度为0,则优先从该点扩展,将该点放入队列
}
while(q.size())
{
int t=q.front();q.pop();
ans=max(ans,f[t]);
for(auto v:g[t]){
f[v]=max(f[v],f[t]+1);
//状态转移,f[i]表示走到i的最长步数
//f[i]的值为它的前驱节点加1
in[v]--;
if(in[v]==0){
q.push(v);
}
}
}
}
signed main()
{
cin>>n>>m;
while(m--)
{
int a,b;
cin>>a>>b;
g[a].push_back(b);
in[b]++;
}
bfs();
cout<<ans<<endl;
return 0;
}