算法训练营|图论第7天 prim算法 kruskal算法

打印 上一主题 下一主题

主题 533|帖子 533|积分 1599

题目:prim算法

题目链接:

53. 寻宝(第七期模拟笔试) (kamacoder.com)
代码:

  1. #include<bits/stdc++.h>
  2. #include<unordered_map>
  3. #include<unordered_set>
  4. using namespace std;
  5. int main() {
  6.         int v, e;
  7.         int x, y, k;
  8.         cin >> v >> e;
  9.         vector<vector<int>>grid(v + 1, vector<int>(v + 1, 10001));
  10.         while (e--) {
  11.                 cin >> x >> y >> k;
  12.                 grid[x][y] = k;
  13.                 grid[y][x] = k;
  14.         }
  15.         vector<int>minEdges(v + 1, 10001);
  16.         vector<bool>Intree(v + 1, false);
  17.         for (int i = 1; i < v; i++) {
  18.                 int cur = -1;
  19.                 int MinVal = INT_MAX;
  20.                 for (int j = 1; j <= v; j++) {
  21.                         if (!Intree[j] && minEdges[j] < MinVal) {
  22.                                 cur = j;
  23.                                 MinVal = minEdges[j];
  24.                         }
  25.                 }
  26.                 Intree[cur] = true;
  27.                 for (int j = 1; j <= v; j++) {
  28.                         if (!Intree[j] && grid[cur][j] < minEdges[j]) {
  29.                                 minEdges[j] = grid[cur][j];
  30.                         }
  31.                 }
  32.         }
  33.         int result = 0;
  34.         for (int i = 2; i <= v; i++) {
  35.                 result += minEdges[i];
  36.         }
  37.         cout << result << endl;
  38. }
复制代码
题目:kruskal算法

题目链接:

53. 寻宝(第七期模拟笔试) (kamacoder.com)
代码:

  1. #include<bits/stdc++.h>
  2. #include<unordered_map>
  3. #include<unordered_set>
  4. using namespace std;
  5. struct Edge {
  6.         int l, r, val;
  7. };
  8. int n = 10001;
  9. vector<int>father(n, -1);
  10. void init() {
  11.         for (int i = 0; i < n; i++) {
  12.                 father[i] = i;
  13.         }
  14. }
  15. int find(int u) {
  16.         if (u == father[u]) return u;
  17.         else {
  18.                 return father[u] = find(father[u]);
  19.         }
  20. }
  21. void join(int u, int v) {
  22.         u = find(u);
  23.         v = find(v);
  24.         if (u == v) return;
  25.         father[v] = u;
  26. }
  27. static bool cmp(const Edge& a, const Edge& b) {
  28.         return a.val < b.val;
  29. }
  30. int main() {
  31.         int v, e;
  32.         int x, y, k;
  33.         cin >> v >> e;
  34.         vector<Edge>edges;
  35.         while (e--) {
  36.                 cin >> x >> y >> k;
  37.                 edges.push_back({ x,y,k });
  38.         }
  39.         sort(edges.begin(), edges.end(), cmp);
  40.         vector<Edge>result;
  41.         init();
  42.         int result_val = 0;
  43.         for (Edge edge : edges) {
  44.                 int x = find(edge.l);
  45.                 int y = find(edge.r);
  46.                 if (x != y) {
  47.                         result.push_back(edge);
  48.                         result_val += edge.val;
  49.                         join(x, y);
  50.                 }
  51.         }
  52.        
  53.         cout << result_val << endl;
  54. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

光之使者

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表