#include <cstring>
#include <iostream>
struct Edge
{
int to, nxt;
};
int edge_cnt;
int head[1005], ans[1005];
bool vis[1005];
Edge graph[1005];
void add(int u, int v)
{
graph[edge_cnt].to = v;
graph[edge_cnt].nxt = head[u];
head[u] = edge_cnt++;
}
void dfs(int r, int u)
{
vis[u] = true;
ans[r] = std::max(ans[r], u);
for (int i = head[u]; i != -1; i = graph[i].nxt)
{
int v = graph[i].to;
if (!vis[v])
dfs(r, v);
}
}
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
int n, m;
std::cin >> n >> m;
memset(head, -1, 4 * (n + 1));
for (int i = 1; i <= m; i++)
{
int u, v;
std::cin >> u >> v;
add(u, v);
}
for (int i = 1; i <= n; i++)
{
memset(vis, false, 4 * (n + 1));
dfs(i, i);
std::cout << ans[i] << " ";
}
std::cout << "\n";
return 0;
}
WA:
#include <iostream>
#include <cstring>
struct Edge
{
int to, nxt;
};
int edge_cnt;
int head[1005], ans[1005];
bool vis[1005];
Edge graph[1005];
void add(int u, int v)
{
graph[edge_cnt].to = v;
graph[edge_cnt].nxt = head[u];
head[u] = edge_cnt++;
}
void dfs(int r, int u)
{
vis[u] = true;
ans[r] = std::max(ans[r], u);
for (int i = head[u]; i != -1; i = graph[i].nxt)
{
int v = graph[i].to;
if (!vis[v])
dfs(r, v);
}
}
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
int n, m;
std::cin >> n >> m;
memset(head, -1, 4 * (n + 1));
for (int i = 1; i <= m; i++)
{
int u, v;
std::cin >> u >> v;
add(u, v);
}
for (int i = 1; i <= n; i++)
{
memset(vis, false, 4 * (n + 1));
dfs(i, i);
}
for (int i = 1; i <= n; i++)
std::cout << ans[i] << " ";
std::cout << "\n";
return 0;
}