#include #include using namespace std; int main(){ //dp只能O(n3),这里最好用bfs或者dfs int v, e; cin >> v >> e; //vector> adj(v, vector()); vector> dp(v, vector(v, false)); for(int i = 0; i < e; i++){ int a, b; cin >> a >> b; //adj[a - 1].push_back(b - 1); //adj[b - 1].push_back(a - 1); dp[a - 1][b - 1] = true; } //考虑dp[i][j] : 两个点是否连通,采取插入k的方式解决 for (int i = 0; i < v; i++) dp[i][i] = true; // 自己到自己连通 for(int k = 0; k < v; k++){ for(int i = 0; i < v; i++){ for(int j = 0; j < v; j++){ if(dp[i][j]) continue; dp[i][j] = dp[i][j] || (dp[i][k] & dp[k][j]); } } } //bfs for(int i = 0; i < v; i++) { vector visited(v, false); queue q; q.push(i); visited[i] = true; int mx = i; while (!q.empty()) { int curr = q.front(); q.pop(); for (int next : adj[curr]) { if (!visited[next]) { visited[next] = true; q.push(next); mx = max(mx, next); } } } cout << mx + 1 << " "; } for(int i = 0; i < v; i++){ int mx = -1; for(int j = 0; j < v; j++){ if(dp[i][j] && mx < j) mx = j; } cout << mx + 1 << " "; } cout << endl; return 0; }