3. 最大节点
题目ID:8257 必做题100分
时间限制: 1000ms
空间限制: 131072kB
题目描述
时间限制:1s 空间限制:128M
题目描述:
给出 N 个点, M 条边的有向图,对于每个点 v ,求 A(v) 表示从点 v 出发,能到达的编号最大的点。
输入格式:
第一行包含两个整数 N,M 。
接下来 M 行,每行两个整数 U_i,V_i ,表示边 <U_i,V_i> 。点用 1,2,⋯,N 编号。
输出格式:
N 个空格分隔的整数 A(1),A(2),⋯ ,A(N) 。
样例输入:
4 3
1 2
2 4
4 3
样例输出:
4 4 3 4
约定:
1≤N,M≤105
WA0分:
#include <bits/stdc++.h>
#include <vector>
#include <stack>
#include <queue>//作者习惯
using namespace std;
int n,m;
int vis[100005];
vector<vector<int> > G;
int maxn = INT_MIN;
void dfs(int x) {
maxn = max(maxn,x);
for(int i = 1;i <= n;i++) {
if(vis[G[x][i]] == 1){
continue;
}
vis[G[x][i]] = 1;
dfs(G[x][i]);
}
}
int main(int argv,char * argc[])//作者习惯
{
int n,m;
cin >> n >> m;
G.resize(n + 1);
for(int i = 1;i <= m;i++) {
int x,y;
cin >> x >> y;
if(x != y){
G[x].push_back(y);
}
}
for(int i = 1;i <= n;i++) {
maxn = INT_MIN;
vis[i] = 1;
dfs(i);
cout << maxn << " ";
}
return 0;
}