洛谷P3916
整体思路:
用二维数组存储能到达第 i 个点的所有点(G[i][]--能到达i的点为G[i][j]),根据题意我们要找的是每一条边做能到达的最大点,所以我们从最大点开始,看这个最大点能到达的所有点,利用dfs()找到,因为我们是从最大点开始搜索,所以一旦找到A[i]就是最优解。
代码:
//输出每个点做能到达的最大点
#include <bits/stdc++.h>
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++) {//遍历能够到达x的所有的点
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);//将u放置与v的最后元素的后一位:存储能够到达v的点(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;
}