题目:

1212 无向图最小生成树

基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注

N个点M条边的无向连通图,每条边有一个权值,求该图的最小生成树。

Input

第1行:2个数N,M中间用空格分隔,N为点的数量,M为边的数量。(2 <= N <= 1000, 1 <= M <= 50000)

第2 - M + 1行:每行3个数S E W,分别表示M条边的2个顶点及权值。(1 <= S, E <= N,1 <= W <= 10000)

Output

输出最小生成树的所有边的权值之和。

Input示例

9 14

1 2 4

2 3 8

3 4 7

4 5 9

5 6 10

6 7 2

7 8 1

8 9 7

2 8 11

3 9 2

7 9 6

3 6 4

4 6 14

1 8 8

Output示例

37

分析:

最小生成树 有两种主要算法, Kruskal 和 Prim、

Kruskal 算法

先把所有边按照权值排序, 依次选择, 把边连接的顶点加入集合,并且加上该边的权值。如果顶点已经在集合中, 择不做操作。

在Kruskal算法中, 集合的实现就用 并查集(不相交集 union-find )来实现。

Prim 算法 :

Kruskal算法是按照边来进行的, Prim 就是按照顶点来进行的。

从任意一个点出发, 把点计入树 T 中, 然后不断贪心选取 T 与其他顶点之间权值最小的边。 并加入 T 中, 就可以得到 MST 了;

实现:

Kruskal算法实现的。

#include <bits/stdc++.h>

using namespace std;

const int maxn = 1000 + 13;

struct Edge {
int from, to, dist;
Edge(int _f, int _t, int _d):\
from(_f), to(_t), dist(_d) {} bool operator < (const Edge a) const {
return this->dist < a.dist;
}
}; struct Kruskal {
int Pre[maxn], Rank[maxn];
int n, m;
vector<Edge> edges; void Init() {
for(int i = 0; i <= this->n; ++i) Pre[i] = i, Rank[i] = 0;
edges.clear();
}
/// UF 的实现
int Find(int x) {
if(Pre[x] == x) return x;
else return Pre[x] = Find(Pre[x]);
} bool Union(int x, int y) {
int ax = Find(x), ay = Find(y);
if(ax == ay) return false;
if(Rank[ax] < Rank[ay])
Pre[ax] = ay;
else {
Pre[ay] = ax;
if(Rank[ay] == Rank[ax]) Rank[ax] ++;
}
return true;
}
/// Kruskal实现。
int kruskal() {
int ans = 0;
sort(edges.begin(), edges.end());
for(int i = 0; i < edges.size(); ++i) {
int u = edges[i].from, v = edges[i].to;
if(Union(u, v)) ans += edges[i].dist;
}
return ans;
} void Add_Edges(int u, int v, int c) {
edges.push_back(Edge(u,v,c));
edges.push_back(Edge(v,u,c));
}
}; Kruskal Ks; int main()
{
int u, v, c;
while(cin >> Ks.n >> Ks.m) {
Ks.Init();
for(int i = 0; i < Ks.m; ++i) {
cin >> u >> v >> c;
Ks.Add_Edges(u, v, c);
}
cout << Ks.kruskal() <<endl;
}
}

51nod--1212 最小生成树的更多相关文章

  1. 51Nod 1212 无向图最小生成树 (路径压缩)

    N个点M条边的无向连通图,每条边有一个权值,求该图的最小生成树.   Input 第1行:2个数N,M中间用空格分隔,N为点的数量,M为边的数量.(2 <= N <= 1000, 1 &l ...

  2. 51Nod 1212无向图最小生成树

    prim #include<stdio.h> #include<string.h> #define inf 0x3f3f3f3f ][]; ],lowc[]; ],int n) ...

  3. 51nod 1212 无向图最小生成树(Kruskal模版题)

    N个点M条边的无向连通图,每条边有一个权值,求该图的最小生成树.   Input 第1行:2个数N,M中间用空格分隔,N为点的数量,M为边的数量.(2 <= N <= 1000, 1 &l ...

  4. (图论)51NOD 1212 无向图最小生成树

    N个点M条边的无向连通图,每条边有一个权值,求该图的最小生成树. 输入 第1行:2个数N,M中间用空格分隔,N为点的数量,M为边的数量.(2 <= N <= 1000, 1 <= M ...

  5. 51Nod-1212 无向图最小生成树

    51Nod: 1212 无向图最小生成树. link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1212 1212  ...

  6. 51nod 1640 天气晴朗的魔法 最小生成树

    题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1640 题解: 先求最小生成树,记录最大边. 然后求最大生成树 ...

  7. 51 nod 1212 无向图最小生成树(Kruckal算法/Prime算法图解)

    1212 无向图最小生成树 N个点M条边的无向连通图,每条边有一个权值,求该图的最小生成树. 收起 输入 第1行:2个数N,M中间用空格分隔,N为点的数量,M为边的数量.(2 <= N < ...

  8. 51nod 天气晴朗的魔法 - (Kruskall最小生成树)

    题目: 基准时间限制:1 秒 空间限制:131072 KB  51nod魔法学校近日开展了主题为“天气晴朗”的魔法交流活动.   N名魔法师按阵法站好,之后选取N - 1条魔法链将所有魔法师的魔力连接 ...

  9. 51 nod 1212 无向图最小生成树

    http://www.51nod.com/Challenge/Problem.html#problemId=1212 代码 #include<bits/stdc++.h> using na ...

  10. 51nod 1213 二维曼哈顿距离最小生成树

    1213 二维曼哈顿距离最小生成树 基准时间限制:4 秒 空间限制:131072 KB 分值: 160 难度:6级算法题  收藏  关注 二维平面上有N个坐标为整数的点,点x1 y1同点x2 y2之间 ...

随机推荐

  1. 学习go语言编程系列之定义变量

    package main import ( "fmt" "math") func main() { // 1. 定义变量名age,不初始化,使用对应类型的默认值 ...

  2. you can't add a reference to Newtonsoft.Json.dll as it was not built against the silverlight runtime

    加载错误: silverlight的framework是精简版本,所以标准的库是引用不了的.必须要引用portable版本的  

  3. C#执行JavaScript脚本代替Compute

    DataTable.Compute不支持round之类的函数,可以调用JScript实现. 1.添加引用Microsoft.Vsa和Microsoft.JScript2.例子代码 object ret ...

  4. vs2013 配置支持https的libcurl

    需求:在vs2013上配置支持https协议的libcurl. 环境:win7(64位),vs2013 一.安装openssl: 需要先安装nasm和ActivePerl. nasm需要手动配置环境变 ...

  5. sql leetcode -Duplicate Emails

    第一种解法: select distinct p1.Email as Email from Person p1, Person p2 where p1.Email=p2.Email and p1.Id ...

  6. file_list(path):遍历文件列表[python]

    import os def __file_list__(path, level): files = os.listdir(path); for i in files: path_tmp = path ...

  7. cpp for each

    第一种 自动推导类型i从arr的地址0 之后地址向下循环向I赋值 for(auto i:arr){ }//arr内的值不会变 第二种  自动推导类型i从arr的地址0 之后地址向下循环向I赋地址 fo ...

  8. class按传递时分析

    class FEF{ public: int a; FEF(int a,int b){ this->a = a*b; } }; void mam(FEF a){ printf("%d ...

  9. luogu P3767 膜法

    传送门 这题如果没有删除操作,可以直接使用可持久化并查集 注意到这种可持久化的依赖关系(是这样说的把)是一棵树,然后对于一个点,自己的操作会影响自己的那棵子树,并且如果是删除操作,就会使得一个子树没有 ...

  10. C 捕获 lua 异常错误

    参考文章https://blog.codingnow.com/2015/05/lua_c_api.html , , )) { printf("file=%s, func=%s, line=% ...