T242416 图的遍历

题目描述

给出NN个点,MM条边的有向图,对于每个点vv,求A(v)A(v)表示从点vv出发,能到达的编号最大的点。

输入格式

第1 行,2 个整数N,MN,M。

接下来MM行,每行2个整数U_i,V_iUi,Vi,表示边(U_i,V_i)(Ui,Vi)。点用1, 2,\cdots,N1,2,,N编号。

输出格式

N 个整数A(1),A(2),\cdots,A(N)A(1),A(2),,A(N)。

输入输出样例

输入 #1
4 3
1 2
2 4
4 3
输出 #1
4 4 3 4

说明/提示

• 对于60% 的数据,1 \le N . M \le 10^31N.M103;

• 对于100% 的数据,1 \le N , M \le 10^51N,M105。

 

思路:反向建边+dfs

代码:

#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;

#define MAXL 100010

int N, M, A[MAXL];
vector<int> G[MAXL]; //vector存图 

void dfs(int x, int d) {
	if(A[x]) return; //访问过 
	A[x] = d;
	for(int i=0; i<G[x].size(); i++)
		dfs(G[x][i], d);
}

int main() {
	int u, v;
	scanf("%d%d", &N, &M);
	for(int i=1; i<=M; i++) {
		scanf("%d%d", &u, &v);
		G[v].push_back(u); //反向建边 
	}
	for(int i=N; i; i--) dfs(i, i); 
	for(int i=1; i<=N; i++) printf("%d ", A[i]);
	printf("\n");
	return 0;
}
 
posted @ 2022-05-30 09:01  LuoJMeng  阅读(37)  评论(0)    收藏  举报