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. MFC新建工程中目录包含中文,资源文件打开失败

    ※尽量不适用中文,各种未知错误,嘿嘿 此方法临时解决问题,可以使程序运行,后续是否还有错误是未知数 需要修改3处位置: 1.资源文件中.rc 右键,点击“查看代码”,找到带中文的资源ID,把中文修改掉 ...

  2. gcc8.2安装

    contrib/download_prerequisites 1.base_url='ftp://gcc.gnu.org/pub/gcc/infrastructure/' 改为base_url='ht ...

  3. 使用autohotkey修改方向键、回车和启动程序

    具体步骤 下载并安装autohotkey. 在你觉得合适的地方鼠标右键-新建-autohotkey script(脚本):或者创建一个别的文件,再把后缀改成ahk也可以 一个新建的ahk文档里面会有这 ...

  4. Python中的进程

    进程 from multiprocessing import Process import time def start(name): time.sleep(1) print('hello', nam ...

  5. [Solution] 985. Sum of Even Numbers After Queries

    Difficulty: Easy Question We have an array A of integers, and an array queries of queries. For the i ...

  6. 异步、非阻塞和IO多路复用总结

    Nginx是并发处理框架的代表者,很多后台业务都会放在Nginx容器中运行,以实现高吞吐,而Nginx能够支持高并发也是由于使用了异步非阻塞处理模型,本文将用通俗的话讲解异步.同步.阻塞.非阻塞的区别 ...

  7. BigDecimal 类型转换、运算、比较

    序:Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.双精度浮点型变量double可以处理16位有效数.在实际应用中,需要对更大或者更小的数 ...

  8. 1. NES简介

    NES(Nintendo Entertainment System)简介 NES是北美地区对任天堂发行的第三代家用游戏机的简称. 1.CPU NES使用一颗理光[1]制造的8位2A03 NMOS处理器 ...

  9. centos7安装zabbix server

    1.参照下列网址方法,打开端口:80,3306,443,22,10050,10051(可能实际不需要打开这么多) https://www.cnblogs.com/lw-2019forlinuxpyth ...

  10. 关于键盘事件对象code值

    e.keyCode || e.which || e.charCode; //IE只有keyCode属性,FireFox中有which和charCode属性,Opera中有keyCode和which属性 ...