文章目录
- Kruskal算法:最小生成树
- 题目背景故事
- 题目描述
- 输入描述
- 输出描述
- 输入样例
- 输出样例
- 解题思路
- C++代码
- 动态规划:最长公共子序列
- 题目背景故事
- 题目描述
- 输入描述
- 输出描述
- 输入样例
- 输出样例
- 解题思路
- C++代码
- 动态规划+二分:最小表示法
- 题目背景故事
- 题目描述
- 输入描述
- 输出描述
- 输入样例
- 输出样例
- 解题思路
- C++代码
- 动态规划+二分:最小表示法
- 题目背景
- 题目描述
- 输入描述
- 输出描述
- 输入样例
- 输出样例
- 解题思路
- C++代码
- 动态规划+贪心:最小代价带权图的最大点双
- 题目背景
- 题目描述
- 输入描述
- 输出描述
- 输入样例
- 输出样例
- 解题思路
- C++代码
- 贪心+二分:最大子矩形
- 题目背景
- 题目描述
- 输入描述
- 输出描述
- 输入样例
- 输出样例
- 解题思路
- C++代码
- 贪心+二分:滑动窗口最大值
- 题目背景
- 题目描述
- 输入描述
- 输出描述
- 输入样例
- 输出样例
- 解题思路
Kruskal算法:最小生成树
题目背景故事
你是一名建筑工人,负责在一个城市中建造一座桥。你需要把这座桥连接的两个岸边的点连起来,并且要使得连接的边的权值和最小。
(图片来源网络,侵删)题目描述
给定一张带权的无向图,求出其最小生成树。
输入描述
第一行包含两个整数n和m,分别表示点数和边数。
(图片来源网络,侵删)接下来m行,每行包含三个整数u, v, w,表示一条从点u到点v的有向边,权值为w。
输出描述
输出最小生成树的权值和。
输入样例
4 5
1 2 3
1 3 4
4 2 6
4 3 5
2 3 7
输出样例
14
解题思路
这道题我们可以使用Kruskal算法来解决。Kruskal算法是一种用于求解最小生成树的算法,它的核心思想是将图中所有边按照权值从小到大排序,然后依次加入边,如果加入后不会形成环,就加入这条为了判断一条边是否会形成环,我们可以使用并查集来维护连通性。每次加入一条边时,我们先将两个端点所在的集合合并,然后判断两个端点是否在同一个集合中,如果不是,就加入这条边。
C++代码
#include #include #include using namespace std; const int N = 1010; struct Edge { int u, v, w; } edges[N]; int p[N]; int find(int x) { if (p[x] != x) p[x] = find(p[x]); return p[x]; } int main() { int n, m; cin >> n >> m; for (int i = 0; i > edges[i].u >> edges[i].v >> edges[i].w; for (int i = 1; i return a.w B + 1; int n = strlen(A + 1), m = strlen(B + 1); for (int i = 1; i dp[i][j] = max(dp[i-1][j], dp[i][j-1]); if (A[i] == B[j]) dp[i][j] = dp[i-1][j-1] + 1; } cout cin A + 1 B + 1; int n = strlen(A + 1), m = strlen(B + 1); for (int i = 1; i dp[i][j] = max(dp[i-1][j], dp[i][j-1]); if (A[i] == B[j]) dp[i][j] = dp[i-1][j-1] + 1; } cout cin n; for (int i = 1; i int l = 1, r = 9; while (l > b >> c; add(a, b, c); f[a][b] = min(f[a][b], c); } floyd(); int res = INF; for (int i = 1; i cin n > m; for (int i = 1; i a[i][j]; for (int i = 1; i if (!a[i][j]) h[i][j] = 0; else h[i][j] = h[i-1][j] + 1; } int res = 0; for (int i = 1; i top = 0; for (int j = 1; j while (top && h[i][st[top]] = h[i][j]) top -- ; l[j] = st[top]; st[ ++ top] = j; } top = 0; for (int j = m; j; j -- ) { while (top && h[i][st[top]] = h[i][j]) top -- ; r[j] = st[top]; st[ ++ top] = j; } for (int j = 1; j cin n k; for (int i = 1; i a[i]; for (int i = 1; i int l = i - k + 1, r = i; while (l 1; if (a[mid]