Kruskal模板:按照边权排序,开始从最小边生成树

#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<iostream>
#define N 1000+5//n 个顶点,m条边
using namespace std;
//最小生成树模板(计算最小生成树的sum)
struct node
{
int u,v,len;//u->v距离len
}q[N];
int f[N],n,m;
int getf(int v)
{
if(f[v]==v)
return v;//找到祖先
return f[v]=getf(f[v]);//压缩路径
}
bool marge(int u,int v)
{
int t1=getf(u),t2=getf(v);
if(t1==t2)
return 0;//同一个祖先,已经连接过
f[t1]=t2;
return 1;
}
bool comp(node a,node b)
{
return a.len<b.len;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<=n;i++)//初始化并查集数组
f[i]=i;//祖先是本身
for(int i=0;i<m;i++)
scanf("%d%d%d",&q[i].u,&q[i].v,&q[i].len);
sort(q,q+m,comp);//按照边的权值从小到大排序
int count=0,sum=0;
for(int i=0;i<m;i++)
{
if(count==n-1)//n个顶点 n-1条边
break;
if(marge(q[i].u,q[i].v))
{
count++;
sum+=q[i].len;
}
}
if(count==n-1)
printf("%d\n",sum);
else
printf("NO\n");
return 0;
}

Prim模板:找树顶点和非树顶点之间的最小边

1、邻接矩阵

//prim算法
#include<stdio.h>
#include<string.h>
#define N 100+5
int main()
{
int n,m,e[N][N],dis[N];
bool book[N];
scanf("%d%d",&n,&m);
memset(dis,0x3f3f3f3f,sizeof(dis));
memset(e,0x3f3f3f3f,sizeof(e));
memset(book,0,sizeof(book));
for(int i=0;i<N;i++)
e[i][i]=0;//邻接矩阵
int u,v,len;
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&u,&v,&len);
e[v][u]=e[u][v]=len;
}
for(int i=1;i<=n;i++)
dis[i]=e[1][i];//初始化dis数组
/* prim核心 */
book[1]=1;//标记树顶点
int count=1,sum=0;//已经加入树的顶点
while(count<n)//知道顶点全部是树顶点
{
int minn=0x3f3f3f3f,j;
for(int i=1;i<=n;i++)//找到树顶点与非树顶点之间最短的边
{
if(dis[i]<minn&&!book[i])
j=i,minn=dis[i];
}
sum+=minn;
count++;
book[j]=1;
for(int i=1;i<=n;i++)//遍历更新树顶点和非树顶点之间的最短路径
{
if(!book[i]&&dis[i]>e[j][i])
dis[i]=e[j][i];
}
}
printf("%d\n",sum);
return 0;
}

2、邻接表

次小生成树:

当给我们求出最小生成树的时候,依次将不属于最小生成树的边(u,v)加入生成树中,此时形成一个环,找出这个环中除了(u,v)最大的边删除,得出的可能是次小生成树,列举所有边,求出次小值.

最小生成树不唯一:

输入边的时候记录一下权值相等的边,求最小生成树,判断边是否被标记,如果被标记,依次删除,看是否能生成最小生成树,如果可以,则最小生成树不唯一。poj - 1679

最新文章

  1. 【python】多进程锁multiprocess.Lock
  2. Linux下MakeFile初探
  3. Scrum4.0+5.0
  4. 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,循环控制及其优化
  5. IOS UIWebView截获html并修改便签内容,宽度自适应
  6. linux 命令学习大全
  7. 【算法】最长公共子序列(nlogn)
  8. noip 2005 等价表达式
  9. Iframe和父窗口互调方法的集合
  10. 此操作只能由 SQL Server 中拥有配置数据库读取权限的用户在已加入到某个服务器场的计算机上执行
  11. 为什么C#动态调用Java的cxf多了bool型参数
  12. 项目常用Javascript分享,包含常用验证和Cookie操作
  13. JavaScript ES6中export及export default的区别
  14. CMD远程连接服务器上的MySQL
  15. 斐波那契数列第n项的值及前n项之和
  16. 【反编译系列】四、反编译so文件(IDA_Pro)
  17. MongoDB MapReduce用法简介
  18. ActiveMQ依赖JDK版本关系
  19. volatile适用场景之二
  20. 无法获取链接服务器 &quot;XXX&quot; 的 OLE DB 访问接口 &quot;SQLNCLI10&quot; 的架构行集 &quot;DBSCHEMA_TABLES_INFO&quot;。该访问接口支持该接口,但使用该接口时返回了失败代码。

热门文章

  1. 初学qt——数据库连接
  2. date成字符串
  3. 解决WebMvcConfigurer下的addViewControllers无法找到制定页面
  4. py基础之有序列表
  5. elasticsearch 高级查询
  6. 关于nw的简单应用
  7. 聊聊CAS - 面试官最喜欢问的并发编程专题
  8. vue-element-admin 模板 登录页面 post请求通过django的csrf认证,处理304错误
  9. Django Queryset增加manager
  10. 1..Net平台的背景