最小生成树MST

Kruskal算法思想:贪心选边,用并查集维护点集。

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <algorithm>
 4 #include <cstring>
 5 #include <cmath>
 6 using namespace std;
 7 const int maxn = 5000 + 10;
 8 int n, m, f[maxn], sum = 0, tot = 0;
 9 struct Edge{
10     int from, to, w;
11     bool operator < (const Edge& ths) const {
12         return w < ths.w;
13     }
14 }adj[maxn];
15 int findset(int x){
16     return x == f[x] ? x : f[x] = findset(f[x]);
17 }
18 void Kruskal(){
19     sort(adj, adj + m);
20     for(int i = 0; i < m; i ++){
21         int f1 = findset(adj[i].from), f2 = findset(adj[i].to);
22         if(f1 != f2){
23             f[f2] = f1;
24             sum += adj[i].w;
25             tot ++;
26             if(tot == m) break;
27         }
28     }
29     return ;
30 }
31 void read(int &x){
32     x = 0; int sig = 1; char ch = getchar();
33     while(!isdigit(ch)) { if(ch == ‘-‘) sig = -1; ch = getchar(); }
34     while(isdigit(ch)) x = 10 * x + ch - ‘0‘, ch = getchar();
35     x *= sig; return ;
36 }
37 void init(){
38     read(n); m = n * (n - 1) * 0.5;
39     for(int i = 0; i < n; i ++) f[i] = i;
40     for(int i = 0; i < m; i ++)
41         read(adj[i].from), read(adj[i].to), read(adj[i].w);
42     return ;
43 }
44 void work(){
45     Kruskal();
46     return ;
47 }
48 void print(){
49     printf("%d\n", sum);
50     return ;
51 }
52 int main(){
53     init();
54     work();
55     print();
56     return 0;
57 }
时间: 2024-10-05 16:58:07

最小生成树MST的相关文章

poj——2031 最小生成树(MST) Kruskal算法

poj——2031 最小生成树(MST)  Kruskal算法 Building a Space Station Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 4985   Accepted: 2503 Description You are a member of the space station engineering team, and are assigned a task in the constructio

POJ 3026 Borg Maze【BFS+最小生成树MST】

Borg Maze Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12014 Accepted: 3925 Description The Borg is an immensely powerful race of enhanced humanoids from the delta quadrant of the galaxy. The Borg collective is the term used to describe

POJ #1789 Truck History 最小生成树(MST) prim 稠密图 链式向前星

Description 题目:链接 这道题的数据集网上比较少,提供一组自己手写的数据: INPUT: 3 aaaaaaa baaaaaa abaaaaa OUTPUT: The highest possible quality is 1/2. 思路 题意比较不好理解,简而言之就是有 n 个字符串,设两个字符串之间的差异为 dis,dis 由两个字符串对应位置上不同字母的数量决定.比如串A"aaaaaaa" .串B"baaaaaa" 和串C"abaaaaa&

最小生成树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind

最小支撑树树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind 最小支撑树树 前几节中介绍的算法都是针对无权图的,本节将介绍带权图的最小支撑树(minimum spanning tree)算法.给定一个无向图G,并且它的每条边均权值,则MST是一个包括G的所有顶点及边的子集的图,这个子集保证图是连通的,并且子集中所有边的权值之和为所有子集中最小的. 本节中介绍三种算法求解图的最小生成树:Prim算法.Kruskal算法和Boruvk

poj_1258 prim最小生成树

题目大意 给定N个点,以及每两个点之间的路径长度,求出一个连接这N个点的方案,使得连接这N个点的总长度最短,求出该总长度. 题目分析 求最小生成树MST的模板题,直接使用prim算法进行求解. 实现(c++) #include<stdio.h> #include<vector> #include<queue> #include<string.h> #include<algorithm> using namespace std; #define M

图基本算法 最小生成树 Prim算法(邻接表+优先队列STL)

这篇文章是对<算法导论>上Prim算法求无向连通图最小生成树的一个总结,其中有关于我的一点点小看法. 最小生成树的具体问题可以用下面的语言阐述: 输入:一个无向带权图G=(V,E),对于每一条边(u, v)属于E,都有一个权值w. 输出:这个图的最小生成树,即一棵连接所有顶点的树,且这棵树中的边的权值的和最小. 举例如下,求下图的最小生成树: 这个问题是求解一个最优解的过程.那么怎样才算最优呢? 首先我们考虑最优子结构:如果一个问题的最优解中包含了子问题的最优解,则该问题具有最优子结构. 最小

图论知识整理(2) 拓扑排序、最短路、最小生成树

===================================== 发现以前图论学的很不好,什么都不会,现在开始整理图论知识了 作者就是个蒟蒻,ORZ各位大神们 ===================================== 定义:对一个有向无环图(Directed Acyclic Graph,简称DAG)进行拓扑排序,将图中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若<u,v> ∈E(G),则u在线性序列中出现在v之前. 说的好像很有道理,然而我并没有看懂它在

朱刘算法 有向图定根的最小生成树poj3164

关于为什么不能用Prim求解此类问题,如下 Prim可以看成是维护两个顶点集或者看成维护一颗不断生成的树(感觉前一种说法好一点) 倘若是有向图有三个顶点1.2.3 边的情况如下 1->2:          5 1->3:         6 2->3:       1000861 3->2:         2 显然若是按照Prim算法来说,先将顶点一压入集合.而后顺势找到最小的顶点2,然后1.2中到三的最短边是1000861,那么花费就是1000866,显然不对的.: 而若是无

最小生成树-Prim算法与Kruskal算法

一.最小生成树(MST) ①.生成树的代价:设G=(V,E)是一个无向连通网,生成树上各边的权值之和称为该生成树的代价. ②.最小生成树:在图G所有生成树中,代价最小的生成树称为最小生成树. 最小生成树的概念可以应用到许多实际问题中. 例:在n个城市之间建造通信网络,至少要架设n-1条通信线路,而每两个城市之间架设通信线路的造价是不一样的,那么如何设计才能使得总造价最小? ③.MST性质:假设G=(V, E)是一个无向连通网,U是顶点集V的一个非空子集.若(u, v)是一条具有最小权值的边,其中