食物链(一)
建立一个图
实际上,只要从入度为0的点bfs道出度为0的点即可
要注意保存每个点的后继节点,这样才方便dfs
此外,记忆化搜索!!!
仿照滑雪的代码
十分重要!!!
#include<iostream>
using namespace std;
/*
利用食物链建图
实际上,只要从入度为0的点bfs道出度为0的点即可
*/
const int N=1001;
int ans=0;
int path[N];
int ru[N];
int chu[N];
int l[N][N];
int dfs(int x){
//搜索
//x为当前搜索到的生物下标
if(path[x]!=-1){
//如果已经存储过,就直接返回
return path[x];
}
//搜索过程
//用记忆化搜索
int p=0;
for(int i=1;i<=l[x][0];i++){
if(chu[x]!=0)
p=max(p,dfs(l[x][i]));
}
path[x]=p+1;
return path[x];
}
int main(){
int n,m;
//g[][0]为出度,g[][1]为入度
int a,b;
while(scanf("%d %d",&n,&m)!=EOF){
ans=0;
for(int i=1;i<=n;i++){
chu[i]=ru[i]=0;
path[i]=-1;
l[i][0]=0;
}
for(int i=1;i<=m;i++){
cin>>a>>b;
//左面出度加一
chu[a]++;
ru[b]++;
//标明关系
l[a][l[a][0]+1]=b;
l[a][0]++;//是长度
}
for(int i=1;i<=n;i++){
if(ru[i]==0)
dfs(i);
}
for(int i=1;i<=n;i++){
if(path[i]>ans)
ans=path[i];
}
cout<<ans<<endl;
}
return 0;
}