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. python的apidoc使用

    一.apidoc的安装 npm install apidoc -g -g参数表示全局安装,这样在哪儿都能使用. 二.apidoc在python接口代码中的使用 def index(): "& ...

  2. Game Engine Architecture 5

    [Game Engine Architecture 5] 1.Memory Ordering Semantics These mysterious and vexing problems can on ...

  3. .netframe初识

    转发自:https://blog.csdn.net/bingshan5haoao/article/details/32966581 https://www.cnblogs.com/liuxx/p/35 ...

  4. JavaScript进度条(datalist/repeater等多个进度条)

    JS代码: function SingleProgressBar() { var iload = document.getElementById("iLoading"); var ...

  5. [原创]自定义参数静默方式安装JDK1.8

    摘要:当Java桌面程序开发完成做产品的时候,面对未知的安装环境,通常是编写一些预安装检测脚本/程序,让程序傻瓜化安装以便减少分发出去的产品带来 的未知工作量(安装答疑,操作系统问题引起安装失败等), ...

  6. Quartz.Net进阶之六:详述 JobStores

    一.介绍 今天开始学习 JobStore,别的先不说,也不用翻译软件来翻译,直接从字面意思看来理解一下.我第一眼的感觉就是 job 是任务的意思,Store 是商店的意思,连起来就是可以存储 Job ...

  7. Python开发——目录

    Python基础 Python开发——解释器安装 Python开发——基础 Python开发——变量 Python开发——[选择]语句 Python开发——[循环]语句 Python开发——数据类型[ ...

  8. winform自定义控件中其他遮挡控件点击事件

    自定义控件在其他窗口调用时,里面的lable阻挡了控件的点击事件 解决方法 自定义控件中lable的 点击事件 private void Lable1_Click(object sender, Eve ...

  9. Web.Debug.config和Web.Release.config设置xdt:Transform无效的解决办法

    在VS中右键网站>发布时xdt:Transform 生效.但是使用tfs的build时,build可以正常通过,但是web.release.config中的xdt:Transform 无效,其它 ...

  10. vue间通信

    1,父子组件通信 props 传递 父组件: 子组件: 2,子父组件通信 父组件: 子组件: 3,子组件与子组件传递 使用bus.js  如下 传递子组件:  接收子组件