最小生成树学习总结

dijkstra算法

floyd算法

最小生成树

将所有的分成两个集合,一个是已经按照最小值排完顺序的,另外一个是没有排完顺序的,每次在查找从排完顺序的集合到未排完顺序的集合的最短路径,然后将未排完顺序的集合里面的值加入到已排完顺序的集合里。

最小生成树算法:

例题,第一行输入N和M,代表点的个数和他们之间存在的连线条数;

下面N行每行有三个整数a,b,L,代表a和b 之间的权值(或长度)为L;

输出: 输出这些点连成一个联通块,所用连线的权值和的最小值;

input:
5 7
1 2 10
1 3 20
1 5 30
2 5 10
2 3 5
4 5 20
4 3 30
output:
45

prim方法:

 1 #include<iostream>
 2 #include<queue>
 3 using namespace std;
 4 const int N=10000;
 5 int n,m;//the number of villages and roads
 6 struct Record
 7 {
 8     int from,to,value;
 9     friend bool operator<(Record A,Record B)
10     {
11         return A.value>B.value;
12     }
13 };
14 priority_queue<Record>Q;
15 int p[N];
16 int find(int x)
17 {
18     if(p[x]==x)return x;
19     return p[x]=find(p[x]);
20 }
21 int prim()
22 {
23     int sum=0;
24     Record re;
25     while(!Q.empty())
26     {
27         re=Q.top();
28         Q.pop();
29     int fa=find(re.from);
30     int fb=find(re.to);
31     if(fa!=fb)
32     p[fa]=fb,sum+=re.value;
33     }
34     return sum;
35 }
36 int main()
37 {
38     while(cin>>n>>m)
39     {
40         for(int i(0);i<=n;i++)p[i]=i;
41         Record IN;
42         for(int i(1);i<=m;i++)
43         {
44             scanf("%d %d %d",&IN.from,&IN.to,&IN.value);
45             Q.push(IN);
46         }
47         int getvalue=prim();
48         cout<<getvalue<<endl;
49     }
50     return 0;
51 }

prim方法不太适合大量数据的计算;

Kruskal 方法:

Dijkstra 算法:

#include<iostream>
using namespace std;
const int N=1100;
const int INF=101000000;
int map[N][N];
int low[N];//记录最短路径
int n,m;//代表点的个数和路线的个数
int kruskal(int s)
{
    for(int i=1;i<=n;i++)
    {
        low[i]=map[s][i];
    }
    low[s]=-1;
    int sum=0,v;
    for(int i=1;i<n;i++)
    {
        int Min=INF;
        for(int j=1;j<=n;j++)
        {
            if(low[j]!=-1&&low[j]<Min)
            {
                Min=low[j];
                v=j;
            }
        } //我经常把这个大括号放错地方,太马虎
            if(Min==INF)return -1;//represent no solution at last;
            sum+=Min;
            low[v]=-1;
            for(int j=1;j<=n;j++)//update the length
            {
                if(low[j]!=-1&&low[j]>map[j][v])
                low[j]=map[j][v];
            }
    }
    return sum;
}
int main()
{
    while(cin>>n>>m)
    {
        for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        map[i][j]=INF;
        int a,b,c;
        for(int i=1;i<=m;i++)
        {
        scanf("%d %d %d",&a,&b,&c);
        if(map[a][b]>c)map[a][b]=map[b][a]=c;//避免两点之间有多条路径,取最小路径
        }
        int q=kruskal(1);//在任何节点开始找都行,因为他们都必须连在一颗树里
        cout<<q<<endl;
    }
    return 0;
}

最小生成树学习总结

时间: 2024-08-06 07:54:55

最小生成树学习总结的相关文章

最小生成树学习

概述: 在一给定的无向图G = (V, E) 中,(u, v) 代表连接顶点 u 与顶点 v 的边(即),而 w(u, v) 代表此边的权重,若存在 T 为 E 的子集(即)且为无循环图,使得 w(T) 最小,则此 T 为 G 的最小生成树.   最小生成树其实是最小权重生成树的简称. 最小生成树: 一个无向连通图G=(V,E),最小生成树就是联结所有顶点的边的权值和最小时的子图T,此时T无回路且连接所有的顶点,所以它必须是棵树. 应用: 网络G表示n个城市之间的通信线路网线路(其中顶点表示城市

最小生成树学习笔记

最小生成树学习笔记 https://zh.wikipedia.org/wiki/%E6%9C%80%E5%B0%8F%E7%94%9F%E6%88%90%E6%A0%91 https://zh.wikipedia.org/wiki/%E6%99%AE%E6%9E%97%E5%A7%86%E7%AE%97%E6%B3%95 注意时间复杂度 模板TBD 原文地址:https://www.cnblogs.com/wuyuanyuan/p/8467905.html

数据结构学习笔记(十)-图的最小生成树与拓扑排序

一.最小生成树 首先应该理解最小生成树的定义: 包含图的所有顶点,V-1条边 没有回路 边的权重和最小 那么实际问题中用到最小生成树是什么时候呢?很多人都觉得学习算法没用,在实际生活工作中根本就用不上,其实并不是用不上,只是你根本没有想到要去用而已!使用了算法后你就会发现事情原来可以这么简单高效! 实际中如需要使用最少的电线给一栋房子安装电路.就可以用最小生成树解决. 1. Prim算法 该算法利用了贪心的思想,大体上与dijkstra算法类似,都需要对每一个顶点保存一个距离值dv和pv,以及一

学习日志---图之最小生成树算法

最小生成树: 从最小生成树的定义可知,构造有n个结点的无向连通带权图的最小生成树,必须满足以下三条: (1)构造的最小生成树必须包括n个结点: (2)构造的最小生成树中有且只有n-1条边: (3)构造的最小生成树中不存在回路. 构造最小生成树的方法有许多种,典型的构造方法有两种,一种称作普里姆(Prim)算法,另一种称作克鲁斯卡尔(Kruskal)算法. 特里姆算法 假设G=(V,E)为一个带权图,其中V为带权图中结点的集合,E为带权图中边的权值集合.设置两个新的集合U和T,其中U用于存放带权图

学习笔记:最小生成树算法

一.普里姆(Prim)算法 ①初始化新图仅包含原图中的任意一个顶点,不包含任何边. ②从原图中选择一条权值最小的边,该边满足有且仅有一个顶点在新图中.将该边加入新图. ③重复直至所有顶点都在新图中,新图即最小生成树. 二.克鲁斯卡尔(Kruskal)算法 ①初始化新图包含原图中的所有顶点,不包含任何边. ②从小到大遍历原图中所有边,若边中的两个顶点在新图中不存在连通路径,则将其加入新图. ③遍历结束后,新图即最小生成树. 三.实现 import java.util.TreeMap; import

[学习-思考-探究]莫队算法 曼哈顿最小生成树与分块区间询问算法-4

若要转载,不需要联系我,只需要在下面回复一下并注明原文. 在线区间询问算法(奇妙算法) 这是最神奇的算法,不仅简单还可以实现在线询问+修改. 考虑基础算法中的优化. 如果我们把整个区间分成$n^{\frac{1}{3}}$块,那么就可以记录任意两块之间的状态啦! 然后只要套用基础算法当中的操作就可以啦! 总空间复杂度和时间复杂度都是$O(n^{\frac{3}{4}})$,还是相当好的. 下面是例题: https://loj.ac/problem/6219 小Y的房间 标程就不放出来啦. 如有不

算法学习三阶段

?? 第一阶段:练经典经常使用算法,以下的每一个算法给我打上十到二十遍,同一时候自己精简代码, 由于太经常使用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都能够把程序打 出来. 1.最短路(Floyd.Dijstra,BellmanFord) 2.最小生成树(先写个prim,kruscal 要用并查集,不好写) 3.大数(高精度)加减乘除 4.二分查找. (代码可在五行以内) 5.叉乘.判线段相交.然后写个凸包. 6.BFS.DFS,同一时候熟练hash 表(要熟,要灵活,代码要

外出学习有感

五一假期外出学习总结 五一放假了,哎,高兴个大头鬼啊! 哪来的什么假期,走,外出培训! 当然,外出培训的虽是占用了我们的假期时间,但是我们还是十分激动的,因为在外学习的我们收获了很多. 第一天,上午讲了树基础和图的存储,都是非常基础的东西,所以就当是复习了一下,学起来也比较轻松,但是图的存储也有一些东西没有理解,就比如prufer数列,感觉听得晕晕呼呼的,下午考试,我考了60分,额,当然会的额没有,该会的都不会,不该会的也都不会! 第二天,上午讲到最近公共祖先,开始讲用倍增和书剖求LCA的时候听

学习进度表

周数 专业学习目标 专业学习时间 新增代码量 博客发表量 人文方面的学习 知识技能总结 13 使用WWW服务搭建信息浏览网站,使用FTP服务实现文件的上传下载. 学习最小生成树.Prim算法.Kruskal算法.Dijkstra算法. 用Javascript脚本语言实现状态栏信息的显示,把长数字进行转换,使之分位显示. 4 275 1 参加了“软件学院团委学生会干部换届竞选大会”.在此过程中听了演讲,学习到了演讲的秘诀,以及如何和大家进行更好的沟通.如何提高人际交往的能力,如何做好一名合格的学生