一:问题描述:
给出N个点,M条边的有向图,对于每个点v,求A(v)表示从点v出发,能到达的编号最大的点。
二:输入要求:
第1行2个整数N,M,表示点数和边数。接下来M行,每行2个整数Ui,Vi,表示边(Ui,Vi)。点用1,2,…,N编号。
说明/提示
对于60%的数据,1≤N,M≤103。
对于100%的数据,1≤N,M≤105。
三:输出要求:
一行N个整数A(1),A(2),…,A(N)。
四:样例
1.样例输入:
4 3
1 2
2 4
4 3
2.样例输出:
4 4 3 4
五:分析:
实现了给出N个点,M条边的有向图后,对于每个点v,求从点v出发能到达的最大编号的点。下面是代码的详细分析: 1. 首先,定义了一个二维数组a[1005][1005]用来表示有向图的邻接矩阵,flag[1005]用来标记节点是否被访问过。 2. 在全局变量Max、n、m中,Max表示从点v出发,能到达的编号最大的点,n为点数,m为边数。 3. 定义了一个深度优先搜索函数dfs(int x),用于从节点x开始深度优先遍历图。 4. 在主函数中,首先读入点数n和边数m。 5. 接下来根据边的输入情况,构建了邻接矩阵a。 6. 对每个点i,依次调用dfs函数进行深度优先搜索,同时记录能到达的最大编号的点Max,并输出Max。 7. 在dfs函数中,对于节点x,遍历与该节点相连的未访问过的节点i,递归调用dfs函数。同时更新Max为访问过的节点中的最大值。 8. 最后输出每个节点能到达的最大编号的点。 综上所述,这段代码使用深度优先搜索算法求解了从每个节点出发能到达的最大编号的点,并将结果输出。
六:代码:
#include <iostream>
using namespace std;
int a[1005][1005],flag[1005]/*临时变量*/;
int Max,n,m;
void dfs(int x){
for(int i=1;i<=n;i++){//进行图的遍历
if(a[x][i]==1&&flag[i]==0){
a[x][i]=0;
flag[i]=1;
if(i>Max)
Max=i;
dfs(i);
a[x][i]=1;//还原操作
flag[i]=0;
}
}
}
int main() {
int i,x,y;
cin>>n>>m;
for(i=1;i<=m;i++){
cin>>x>>y;
a[x][y]=1;
}
for(i=1;i<=n;i++){
Max=i;
flag[i]=1;
dfs(i);
flag[i]=0;
cout<<Max<<" ";
}
return 0;
}