题目描述
给出 N 个点,M 条边的有向图,对于每个点 v,求 A(v) 表示从点 v 出发,能到达的编号最大的点。
输入格式
第 1 行 2 个整数 N,M,表示点数和边数。
接下来 M 行,每行 2 个整数 Ui,Vi,表示边(Ui,Vi)。点用 1,2,…,N 编号。
输出格式
一行 N 个整数 A(1),A(2),…,A(N)。
样例输入
4 3
1 2
2 4
4 3
样例输出
4 4 3 4
我们先用邻接矩阵来存储这个图
cin>>n>>m;
int x,y;
for(int i=1;i<=m;i++){
cin>>x>>y;
a[x][y]=1;
}
然后我们就用一个搜索来把图遍历一遍
搜索函数:
一个for循环,把每个节点遍历一遍,如果有边(a[bt][i]==1)且没走过,就记录一下最大值,接着调用一遍深搜函数
主函数里面用for循环找到每一个节点,然后调用函数,输出最大值就行了
#include<bits/stdc++.h>
using namespace std;
int n,m;
int mx=0;
int a[1001][1001];//存储图
int v[1001];//用于标记有没有走过
int dfs(int bt){//搜索函数
v[bt]=1;//标记当前节点
for(int i=1;i<=n;i++){//遍历
if(a[bt][i]==1&&v[i]==0){
mx=max(mx,i);//找最大值
dfs(i);//调用
}
}
return 0;
}
int main(){
cin>>n>>m;
int x,y;
for(int i=1;i<=m;i++){//存入邻接矩阵
cin>>x>>y;
a[x][y]=1;
}
for(int i=1;i<=n;i++){//遍历
mx=i;//初始化
dfs(i);
cout<<mx<<" ";//输出
memset(v,0,sizeof(v));//清空
}
return 0;
}