Prim

设图G=(V,E)是一个具有n个顶点的连通网,其生成树的顶点集合为U。首先把v0放入U,再在所有的u∈U,v∈V-U的边(u,v)∈E中找一条最小权值的边,加入生成树,并把该边的v加入U集合。如果U集合已经有n个元素,则结束,否则在剩下的部分中继续寻找最小权值的边。

 #include<stdio.h>
#include<stdlib.h> #define infinity 9999
#define MAX 20 int G[MAX][MAX],spanning[MAX][MAX],n; int prims(); int main()
{
int i,j,total_cost;
printf("Enter no. of vertices:");
scanf("%d",&n); printf("\nEnter the adjacency matrix:\n"); for(i=;i<n;i++)
for(j=;j<n;j++)
scanf("%d",&G[i][j]); total_cost=prims();
printf("\nspanning tree matrix:\n"); for(i=;i<n;i++)
{
printf("\n");
for(j=;j<n;j++)
printf("%d\t",spanning[i][j]);
} printf("\n\nTotal cost of spanning tree=%d",total_cost);
return ;
} int prims()
{
int cost[MAX][MAX];
int u,v,min_distance,distance[MAX],from[MAX];
int visited[MAX],no_of_edges,i,min_cost,j; //create cost[][] matrix,spanning[][]
for(i=;i<n;i++)
for(j=;j<n;j++)
{
if(G[i][j]==)
cost[i][j]=infinity;
else
cost[i][j]=G[i][j];
spanning[i][j]=;
} //initialise visited[],distance[] and from[]
distance[]=;
visited[]=; for(i=;i<n;i++)
{
distance[i]=cost[][i];
from[i]=;
visited[i]=;
} min_cost=; //cost of spanning tree
no_of_edges=n-; //no. of edges to be added while(no_of_edges>)
{
//find the vertex at minimum distance from the tree
min_distance=infinity;
for(i=;i<n;i++)
if(visited[i]==&&distance[i]<min_distance)
{
v=i;
min_distance=distance[i];
} u=from[v]; //insert the edge in spanning tree
spanning[u][v]=distance[v];
spanning[v][u]=distance[v];
no_of_edges--;
visited[v]=; //updated the distance[] array
for(i=;i<n;i++)
if(visited[i]==&&cost[i][v]<distance[i])
{
distance[i]=cost[i][v];
from[i]=v;
} min_cost=min_cost+cost[u][v];
} return(min_cost);
}

COST = 16 + 5 + 6 + 11 + 18 =

Kruskal

 #include<stdio.h>

 #define MAX 30

 typedef struct edge
{
int u,v,w;
}edge; typedef struct edgelist
{
edge data[MAX];
int n;
}edgelist; edgelist elist; int G[MAX][MAX],n;
edgelist spanlist; void kruskal();
int find(int belongs[],int vertexno);
void union1(int belongs[],int c1,int c2);
void sort();
void print(); void main()
{
int i,j,total_cost; printf("\nEnter number of vertices:"); scanf("%d",&n); printf("\nEnter the adjacency matrix:\n"); for(i=;i<n;i++)
for(j=;j<n;j++)
scanf("%d",&G[i][j]); kruskal();
print();
} void kruskal()
{
int belongs[MAX],i,j,cno1,cno2;
elist.n=; for(i=;i<n;i++)
for(j=;j<i;j++)
{
if(G[i][j]!=)
{
elist.data[elist.n].u=i;
elist.data[elist.n].v=j;
elist.data[elist.n].w=G[i][j];
elist.n++;
}
} sort(); for(i=;i<n;i++)
belongs[i]=i; spanlist.n=; for(i=;i<elist.n;i++)
{
cno1=find(belongs,elist.data[i].u);
cno2=find(belongs,elist.data[i].v); if(cno1!=cno2)
{
spanlist.data[spanlist.n]=elist.data[i];
spanlist.n=spanlist.n+;
union1(belongs,cno1,cno2);
}
}
} int find(int belongs[],int vertexno)
{
return(belongs[vertexno]);
} void union1(int belongs[],int c1,int c2)
{
int i; for(i=;i<n;i++)
if(belongs[i]==c2)
belongs[i]=c1;
} void sort()
{
int i,j;
edge temp; for(i=;i<elist.n;i++)
for(j=;j<elist.n-;j++)
if(elist.data[j].w>elist.data[j+].w)
{
temp=elist.data[j];
elist.data[j]=elist.data[j+];
elist.data[j+]=temp;
}
} void print()
{
int i,cost=; for(i=;i<spanlist.n;i++)
{
printf("\n%d\t%d\t%d",spanlist.data[i].u,spanlist.data[i].v,spanlist.data[i].w);
cost=cost+spanlist.data[i].w;
} printf("\n\nCost of the spanning tree=%d",cost);
}

prim算法和克鲁斯卡尔算法的更多相关文章

  1. prim算法,克鲁斯卡尔算法---最小生成树

    最小生成树的一个作用,就是求最小花费.要在n个城市之间铺设光缆,主要目标是要使这 n 个城市的任意两个之间都可以通信,但铺设光缆的费用很高,且各个城市之间铺设光缆的费用不同,因此另一个目标是要使铺设光 ...

  2. 最小生成树---普里姆算法(Prim算法)和克鲁斯卡尔算法(Kruskal算法)

    普里姆算法(Prim算法) #include<bits/stdc++.h> using namespace std; #define MAXVEX 100 #define INF 6553 ...

  3. hdu 1233(还是畅通project)(prime算法,克鲁斯卡尔算法)(并查集,最小生成树)

    还是畅通project Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  4. Kurskal算法(克鲁斯卡尔算法)

    特点:适用于稀疏图,边比较少的图.如果顶点较少,且为稠密图,则用Prim算法.跟Prim算法的用途相同.时间复杂度为O(e*loge),其中e为边数. 代码: #include <stdio.h ...

  5. 最小生成树-克鲁斯卡尔算法(kruskal's algorithm)实现

    算法描述 克鲁斯卡尔算法是一种贪心算法,因为它每一步都挑选当前最轻的边而并不知道全局路径的情况. 算法最关键的一个步骤是要判断要加入mst的顶点是否会形成回路,我们可以利用并查集的技术来做. 并查集的 ...

  6. 最小生成树之Kruskal(克鲁斯卡尔)算法

    学习最小生成树算法之前我们先来了解下下面这些概念: 树(Tree):如果一个无向连通图中不存在回路,则这种图称为树. 生成树 (Spanning Tree):无向连通图G的一个子图如果是一颗包含G的所 ...

  7. 最小生成树--克鲁斯卡尔算法(Kruskal)

    按照惯例,接下来是本篇目录: $1 什么是最小生成树? $2 什么是克鲁斯卡尔算法? $3 克鲁斯卡尔算法的例题 摘要:本片讲的是最小生成树中的玄学算法--克鲁斯卡尔算法,然后就没有然后了. $1 什 ...

  8. 贪心算法(Greedy Algorithm)之最小生成树 克鲁斯卡尔算法(Kruskal&#39;s algorithm)

    克鲁斯卡尔算法(Kruskal's algorithm)是两个经典的最小生成树算法的较为简单理解的一个.这里面充分体现了贪心算法的精髓.大致的流程能够用一个图来表示.这里的图的选择借用了Wikiped ...

  9. 贪心算法(Greedy Algorithm)最小生成树 克鲁斯卡尔算法(Kruskal&#39;s algorithm)

    克鲁斯卡尔算法(Kruskal's algorithm)它既是古典最低的一个简单的了解生成树算法. 这充分反映了这一点贪心算法的精髓.该方法可以通常的图被表示.图选择这里借用Wikipedia在.非常 ...

随机推荐

  1. SpringBoot之Swagger2

    SpringBoot利用Swagger2只需配置少量的注解信息便能方便地构建强大的API文档. 1.添加maven依赖 2.创建Swagger2配置类 3.在API添加文档内容 4.访问http:// ...

  2. 通过微信公众号API复制公众号自定义菜单同时增加子菜单方法

    主要的原因是再不破坏公众号以前的菜单的基础上增加自定义菜单,主要步骤如下: 1.通过微信提供的微信公众平台接口调试工具获取公众号的所有自定义菜单 网址:https://mp.weixin.qq.com ...

  3. ASP.NET结合Redis实现分布式缓存

    最近一个项目ASP.NET+MySQL 有的网页打开初始化的查询需要10秒甚至更久,用户体验极差,而且并发量变大的时候网站容易崩溃 后来想了两种解决方案都不是太满意 1.数据库里建一张缓存表,后台作业 ...

  4. 【笔记】Python基础一 :变量,控制结构,运算符及数据类型之数字,字符串,列表,元组,字典

    一,开发语言介绍 高级语言:Java,C#,Python  ==>产生字节码 低级语言:C,汇编                   ==>产生机器码 高级语言开发效率高,低级语言运行效率 ...

  5. mysql常用的统计类sql ,以及批量循环插入数据

    今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ...

  6. 轮播插件swiper

    使用步骤 1.引用js <script src="swiper/swiper.min.js" type="text/javascript" charset ...

  7. 安装centos 6.7&7.4

    1.安装centos 6.7 1) 2)检查软件有无故障.没有必要检查.选择skip,跳过 3) 4) 5) 6)选择存储设备,第一个为基本存储设备,比如ssd,scsi等常见笔记本.电脑,服务器都选 ...

  8. java基础 ----- 程序的调试

    --- -- 什么是程序调试 当程序出错时,我们希望可以这样 逐条语句执行程序   -----    观察程序的执行情况 ------  发现问题   -----  解决问题 但是,程序一闪就运行结束 ...

  9. pycharm工具配置

    灰色主题 菜单栏File --> Settins --> Appearance & Behavior --> Appearance, Theme改成Darcula,然后App ...

  10. 用BlockingQueue实现的简单发布订阅模式