专题四 · 1001

Posted suamfadmp

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了专题四 · 1001相关的知识,希望对你有一定的参考价值。

代码及解释

#include <algorithm>
#include <iostream>

//
// kruskal + 并查集 + 边表
//

struct node 
  int from;
  int to;
  int w;
;

node edge[102 * 100];
int parent[102];

bool cmp(node a, node b) 
  if (a.w <= b.w)
    return true;
  return false;

//查找已经建完道路的顶点
int find(int a) 
  if (a != parent[a])
    return find(parent[a]);
  else
    return a;

int kruskal(int n, int m) 
  std::sort(edge, edge + m, cmp); //将边的权值从小到大排序
  int i, x, y, ans = 0;
  for (i = 0; i < m; i++) 
    x = edge[i].from;
    y = edge[i].to;
    x = find(x);
    y = find(y);
    if (x != y) 
      ans += edge[i].w;
      parent[y] = x;
    
  
  return ans;


int main() 
  int n, q, k, i, j, m;
  while (std::cin >> n) 
    m = 0;
    for (i = 1; i <= n; i++) 
      for (j = 1; j <= n; j++) 
        std::cin >> k;
        if (i >= j)
          continue; //标记过的不用重复记录
        edge[m].from = i;
        edge[m].to = j;
        edge[m].w = k;
        m++;
      
    
    for (k = 1; k <= n; k++)
      parent[k] = k;
    std::cin >> q;
    //将建完的道路的起点和终点都置为相同的起点
    for (k = 1; k <= q; k++) 
      std::cin >> i >> j;
      i = find(i);
      j = find(j);
      parent[j] = i;
    
    // n个点,m条边
    std::cout << kruskal(n, m) << std::endl;
  
  return 0;

以上是关于专题四 · 1001的主要内容,如果未能解决你的问题,请参考以下文章

小专题哈密顿回路

4/6 深搜广搜专题+二分答案+单调队列

kuangbin专题专题四 MPI Maelstrom POJ - 1502

专题四:自定义Web浏览器

SQL语句复习专题四

kuangbin专题四 : 最短路 I 题 Arbitrage