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. JSONObject optString

    JSONObject optString  获取后台返回的{"state":1001,"data":"数据保存成功"} 用optString ...

  2. findbugs插件使用

    本文以idea的插件举例子 介绍 Findbugs是一个静态分析工具,它检查类或者JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题. idea安装 自此,插件安装完毕,需要重启idea才生 ...

  3. python之字符串及其方法---整理集

    字符串方法 1.capitalize方法:字符串首字母大写 举例: test="alex" v=test.capitalize() print(v) 返回结果: Alex 2.ca ...

  4. Git简单生成生成公钥和私钥方法

    Git简单生成生成公钥和私钥方法 Git配置 Git安装完之后,需做最后一步配置.打开git bash,分别执行以下两句命令 git config --global user.name “用户名” g ...

  5. Python基础 ----- 流程控制

    ------   条件判断 if 条件判判断语法: 条件判断注意: 1.由if 条件起始 2.关键字后面要加一个空格 3.条件后面接: 4.符合python代码缩进格式 5.条件判断可以有多种组合方式 ...

  6. Excel uploading date format

    if l_wa_field-value eq 'ZFIRST_REQ_DATE'. clear lv_length. lv_length = strlen( l_wa_excel-value ). c ...

  7. 通过ssh StrictHostKeyChecking解决自动化git项目问题

    SSH 公钥检查是一个重要的安全机制,可以防范中间人劫持等黑客攻击.但是在特定情况下,严格的 SSH 公钥检查会破坏一些依赖 SSH 协议的自动化任务,就需要一种手段能够绕过 SSH 的公钥检查. 首 ...

  8. Eclipse常用快捷键--摘录他人

    Eclipse常用快捷键 1几个最重要的快捷键 代码助手:Ctrl+Space(简体中文操作系统是Alt+/) 快速修正:Ctrl+1 单词补全:Alt+/ 打开外部Java文档:Shift+F2显示 ...

  9. 从xampp到phpmyadmin

    目录 xampp的安装和配置 尝试运行Example11_1(图形化管理工具的可视化界面) 参考博文 xampp的安装和配置 主要参考博文Intellj IDEA 简易教程 1.下载并安装xampp ...

  10. Pyjwt ,python jwt ,jwt

    pip install Pyjwt 不错的jwt 文章: https://www.cnblogs.com/wayneiscoming/p/7513487.html Sampleimport jwt i ...