3040: 【普及/提高-】【P3916】图的遍历
内存限制:128 MB
时间限制:1.000 S
评测方式:文本比较
命题人:
提交:2
解决:2
题目描述
给出 个点, 条边的有向图,对于每个点 ,求 表示从点 出发,能到达的编号最大的点。
输入
第 行 个整数 ,表示点数和边数。
接下来 行,每行 个整数 ,表示边 。点用 编号。
输出
一行 个整数 。
样例输入 复制
4 3
1 2
2 4
4 3
样例输出 复制
4 4 3 4
提示
- 对于 的数据,。
- 对于 的数据,。
#include<bits/stdc++.h>
using namespace std;
#define MAXN 100005
int n,m;
vector <int> p[MAXN];
int a[MAXN];
void solve (int x,int v) {
a[x] = v; //将点x的答案更新为v
for (int i = 0; i < p[x].size(); i++)
if (a[p[x][i]] == 0) //如果答案没有被更新过,则用当前点的值更新
solve(p[x][i],v);
}
int main(){
cin >> n >> m;
for (int i = 1; i <= m; i++) {
int u,v;
cin >> u >> v;
p[v].push_back(u); //建反向边
}
for (int i = n; i >= 0; i--)
if (a[i] == 0)
solve(i,i);
for (int i = 1; i <= n; i++)
cout << a[i] << ' ';
return 0;
}