前置知识

图的存储、并查集

什么是最小生成树?

今天要讲解的算法是最小生成树,那么什么是最小生成树呢?由于是面向新手的算法教程,尽量用大白话来讲清楚最小生成树这个定义。
假定有这么一个问题,有6个城市,城市之间有一些道路,修道路需要花费不同的金额,现在要你选择其中一些道路,使得所有城市可以互相到达(联通)且花费最小。这个问题的答案就是最小生成树,我们把这个问题抽象为一张图,每个城市是一个点,城市与城市的道路是一条无向边。

如何求解这个问题?

Prim算法

算法思路:将所有城市分为两个集合,一个集合X是已经在最小生成树中的城市,另外一个集合S是不在最小生成树的城市。一开始所有的城市都在集合S中,集合X为空,第一步任意选择一个点加入X,接着是一个循环,每次选择集合S的城市中离集合X中城市最近的一个城市,加入X中并把这条道路加入最小生成树中直到所有点都加入X中。

如上图,首先X为空集,挑选A作为起始起点,此时有3个城市B、C、D与A联通{A<->{B,C,D}}其权值分别为{6,5,1},我们选择道路A<->C,将C加入X中,此时可选择的边有{A<->{B,D},C<->{B,D,E,F}}同样的我们选择最短一条边,将F加入X,如此反复。

代码

#include<bits/stdc++.h>
using namespace std;
int mp[105][105],st[105],d[105];//mp存储无向边,st表示该城市是否被加入集合X,d表示 集合S到集合X的花费值
int n;
int prim()
{memset(d,0x3f,sizeof(d));//初始化X无点,集合S和集合X不连通int res=0;d[1]=0;//选择1号点加入集合X,花费为0for(int i=1;i<=n;i++){int t=-1;for(int j=1;j<=n;j++){if(st[j]==0&&(t==-1||d[t]>d[j]))t=j;//如果点在X中就不要重复选了,选择一个集合X外最小的点}// cout<<t<<" ";st[t]=1;//入集合Xres+=d[t];//这条边加入最小生成树中for(int j=1;j<=n;j++)d[j]=min(d[j],mp[t][j]);//加入新点后,更新一下两个集合之间的距离}return res;
}
int main()
{cin>>n;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)cin>>mp[i][j];cout<<prim();
}

Kruskal算法

算法思路:将所有边排序,每次选择最短的一条边,如果这条边连接的两个点不在同一个集合中,将两点相连。

代码

#include<bits/stdc++.h>
using namespace std;
struct edge{int a,b,w;//边的起点和终点以及权值bool operator <(const edge&t)const{//由小到大排序return w<t.w;}
}e[1005];
int p[1005];
int find(int x)//并查集来快速判断两点是否在一个集合
{if(p[x]!=x)return p[x]=find(p[x]);return p[x];
}
int main()
{int n,m;cin>>n>>m;for(int i=1;i<=m;i++)//读入边{int a,b,c;cin>>a>>b>>c;e[i]={a,b,c};}sort(e+1,e+1+m);//排序for(int i=1;i<=n;i++)p[i]=i;int res=0;for(int i=1;i<=m;i++){int a,b,c;a=find(e[i].a),b=find(e[i].b),c=e[i].w;if(a!=b)p[a]=b,res+=c;//如果两个点不在同一个集合,连上边。}cout<<res;}

ACM入门-最小生成树及其应用相关推荐

  1. C语言oj学生成绩输入和输出,『ACM入门』蓝桥杯ACM训练系统基本输入输出教程

    在介绍训练场的OJ系统之前,首先为大家介绍一下ACM: ACM原代表美国计算机协会,因其举办的ICPC即国际大学生程序设计竞赛而闻名全世界,此项赛事要求学生的在五小时内解决全英文问题,并在效率和速度以 ...

  2. c语言记忆化搜索,HNUSTC语言基础简单数据结构acm入门第一讲搜索.ppt

    C语言基础,简单数据结构,ACM入门讲座搜索部分 Bjut:mark063 2010.10.30 1 Evaluation only. Created with Aspose.Slides for . ...

  3. ACM入门之【最小生成树】

    prim模板 int g[N][N],dist[N],n,m,ans; int st[N]; void prim() {memset(dist,0x3f,sizeof dist);dist[1]=0; ...

  4. ACM入门及STL简介(转)

    第一章 新手入门 1.      ACM国际大学生程序设计竞赛简介 1)      背景与历史 1970年在美国TexasA&M大学举办了首次区域竞赛,从而拉开了国际大学生程序设计竞赛的序幕. ...

  5. 【转载】ACM入门 .

    初期: 一.基本算法:      (1)枚举. (poj1753,poj2965)      (2)贪心(poj1328,poj2109,poj2586)      (3)递归和分治法.      ( ...

  6. ACM入门指南[转]

    前言: 这篇指南不对ACM/ICPC国际大学生程序设计竞赛进行介绍,计算机学子如果不了解的可以在百度上进行搜索查询,这里介绍的只是一个计算机学生想要在ACM/ICPC里进行发展的初学者.内容比较简单通 ...

  7. ACM入门之【搜索】

    搜索在ACM中是很重要的. 搜索一般分为DFS和BFS两大类,下面又划分很多的小类. 入门习题: 842. 排列数字 843. n-皇后问题 844. 走迷宫 845. 八数码

  8. ACM入门之【读入、输出优化】

    本文主要是基于oiwiki的做的总结,未来也会做一系列的相关文章.如果想继续看的话可以关注专栏. 做这个专栏的目的是因为自己最近开始系统的再打一下基础.于是想写一个专栏便于喜爱ACM的初学者入门. 目 ...

  9. ACM入门及STL简介

    1.       ACM 国际大学生程序设计竞赛简介 1)       背景与历史 1970 年在美国TexasA&M 大学举办了首次区域竞赛,从而拉开了国际大学生程序设计竞赛的序幕.1977 ...

  10. 大牛对ACM入门菜鸟的一些话

    http://www.cnblogs.com/yefengCrazy/p/5636677.html 首先就是我为什么要写这么一篇日志.原因很简单,就是因为前几天有个想起步做ACM人很诚恳的问我该如何入 ...

最新文章

  1. 苹果手机在火车站被偷的状况下如何定位找回
  2. 如何用Curl 来post xml 数据
  3. Kubernetes系统架构简介
  4. WPF/Silverlight Layout 系统概述——Measure(转)
  5. QT中关于按钮以及菜单栏工具添加图标,以及快捷方式
  6. 在linux kernel或android中解析cmdline参数
  7. Andriod SDK Manager国内无法更新的解决方案
  8. python学习之路-第七天-python面向对象编程简介
  9. socket与socketServer通信
  10. java怎么设置404界面_如何使用Spring MVC显示自定义的404 Not Found页面
  11. 排序算法值--堆排序
  12. linux程序内存布局,关于Linux中程序的内存布局
  13. educoder 使用线程锁(lock)实现线程同步_Java8并发包源码分析:重入锁ReentrantLock和Condition实现原理...
  14. R语言入门——rep函数
  15. 新浪微博共享登录后无法退出切换账号问题解决
  16. signature=bf81fe7f4f17ad23bbd6aa8f365d3bc7,【迅雷高端用户入门手册】(第七集)简单分析迅雷崩溃...
  17. 天池大数据众智平台 - 数据科学家社区
  18. 排序——使每位学生都有座位的最少移动次数
  19. 测试常用正则表达式整理汇总
  20. Python基础知识回顾

热门文章

  1. 火狐插件Adblock Plus自定义功能屏蔽网易博客广告
  2. UVALive 3713 Astronauts(2-sat+输出任意路径)
  3. .NET连接IMB DB2数据库的一些问题及最终完美解决方案!
  4. 【遥控器开发基础教程1】疯壳·开源编队无人机-GPIO(遥控器指示灯控制)
  5. 《剑来》语句摘录(四)
  6. 剑指offer T26 重排链表
  7. 如何用树莓派搭建一台永久运行的个人服务器?
  8. 2005年九大受宠技术:TD-SCDMA
  9. 【搞个事】主页被劫持,改注册表进行修复
  10. 网络流量采集(一)概述