每日一练c++题目日刊 | 第十一期

慈云数据 1年前 (2024-03-19) 技术支持 79 0

文章目录

  • Kruskal算法:最小生成树
    • 题目背景故事
    • 题目描述
    • 输入描述
    • 输出描述
    • 输入样例
    • 输出样例
    • 解题思路
    • C++代码
    • 动态规划:最长公共序列
      • 题目背景故事
      • 题目描述
      • 输入描述
      • 输出描述
      • 输入样例
      • 输出样例
      • 解题思路
      • C++代码
      • 动态规划+二分:最小表示法
        • 题目背景故事
        • 题目描述
        • 输入描述
        • 输出描述
        • 输入样例
        • 输出样例
        • 解题思路
        • C++代码
        • 动态规划+二分:最小表示法
          • 题目背景
          • 题目描述
          • 输入描述
          • 输出描述
          • 输入样例
          • 输出样例
          • 解题思路
          • C++代码
          • 动态规划+贪心:最小代价带权图的最大点双
            • 题目背景
            • 题目描述
            • 输入描述
            • 输出描述
            • 输入样例
            • 输出样例
            • 解题思路
            • C++代码
            • 贪心+二分:最大子矩形
              • 题目背景
              • 题目描述
              • 输入描述
              • 输出描述
              • 输入样例
              • 输出样例
              • 解题思路
              • C++代码
              • 贪心+二分:滑动窗口最大值
                • 题目背景
                • 题目描述
                • 输入描述
                • 输出描述
                • 输入样例
                • 输出样例
                • 解题思路

                  Kruskal算法:最小生成树

                  题目背景故事

                  你是一名建筑工人,负责在一个城市中建造一座桥。你需要把这座桥连接的两个岸边的点连起来,并且要使得连接的边的权值和最小。

                  每日一练c++题目日刊 | 第十一期
                  (图片来源网络,侵删)

                  题目描述

                  给定一张带权的无向图,求出其最小生成树。

                  输入描述

                  第一行包含两个整数n和m,分别表示点数和边数。

                  每日一练c++题目日刊 | 第十一期
                  (图片来源网络,侵删)

                  接下来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] 
微信扫一扫加客服

微信扫一扫加客服