#include<vector> #include<algorithm> using namespace std; longlongint edge[2022][2022] = {0}; intgcd(int a, int b) { if (a < b) { int c = a; a = b; b = c; } return (b == 0) ? a : gcd(b, a % b); } longlongint dis[2022]; // 存储着1到各个点最小距离 int haveFind[2022]; //如果找到了1到某个点的最小距离则该点记为1 int path[2022]; //比如path[2] = 3,那么改最短路径的前继节点为3
#include<vector> #include<algorithm> using namespace std; longlongint edge[2022][2022]; int path[2022][2022]; intgcd(int a, int b) { if (a < b) { int c = a; a = b; b = c; } return (b == 0) ? a : gcd(b, a % b); } intmain() { for (int i = 1; i <= 2021; i++) { for (int j = 1; j <= 2021; j++) { if (abs(i - j) > 21) { edge[i][j] = edge[j][i] = 1145140000; } elseif (i == j) { edge[i][j] = 0; } else { edge[i][j] = edge[j][i] = i * j / gcd(i, j); } } }
for (int i = 1; i <= 2021; i++) { for (int j = 1; j <= 2021; j++) { for (int k = 1; k <= 2021; k++) { if (edge[j][i] + edge[i][k] <= edge[j][k]) { edge[j][k] = edge[j][i] + edge[i][k]; path[j][k] = path[k][j] = i; } } } } printf("%lld", edge[1][2021]); }
DFS深度搜索
例题一
其中N<=100000
题中认为子节点是无序的,因此才有得到的二叉树不同,例如2放到左边和右边
graph TB
subgraph 二叉树2 left
1a((1))
1a-->2a((2))
2a-->5a((5))
2a-->3a((3))
3a-->4a((4))
end
subgraph 多叉树2 left
1((1))
1-->2((2))
1-->3((3))
1-->4((4))
2-->5((5))
end
subgraph 二叉树2 right
1d((1))
1d-->3d((3))
3d-->4d((4))
4d-->2d((2))
2d-->5d((5))
end
subgraph 多叉树2 right
1b((1))
1b-->3b((3))
1b-->4b((4))
1b-->2b((2))
2b-->5b((5))
end
#include<stdio.h> #include<vector> #define maxn 1e6+5 using namespace std; vector<int> tree[(int)maxn];
intdfs(int node) { int max = 0; for (int i = 0; i < tree[node].size(); i++) { int value = dfs(tree[node][i]); max = (max < value) ? value : max; } return max + tree[node].size(); } intmain() { int n; scanf_s("%d", &n); int j; for (int i = 2; i <= n; i++) { scanf_s("%d", &j); tree[j].push_back(i); } printf("%d", dfs(1));
}
例题二 受伤的皇后
有一个 n×n 的国际象棋棋盘(n 行 n 列的方格图),请在棋盘中摆放 n 个受伤的国际象棋皇后,要求: