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. linux 下oracle导入dmp文件

    2017年08月01日 19:10:49 xuxie13 阅读数:17788   最近要到某公司进行poc演示,整了个新项目,需要我数据库修改项目,这才有了这篇博客. 首先进入linux下oracle ...

  2. CSRF总结

    一.CSRF概述 CSRF跨站请求伪造,2007年被列为互联网20大安全隐患之一. 什么是跨站请求伪造?CSRF或XSRF 挟制用户在当前已经登录的web应用程序上执行非本意的操作的攻击方法.攻击者盗 ...

  3. python多线程的学习

    0x00.前言 学了一下python的多线程,threading模块 感觉挺有意思的,随便练手写了一个很粗陋的windows下多线程扫在线ip的脚本 脚本没什么技术含量,纯粹练手,扫一趟192的局域网 ...

  4. ceph mimc版本ceph-deploy安装与配置

    系统环境centos7.6 内核5.0.9 YUM源配置 [root@k8s-sys-10-82-4-200 ceph-cluster]# cat /etc/yum.repos.d/ceph.repo ...

  5. pwnable.kr-flag-witeup

    嗯,看到提示,需要逆向哦. 欧克,运行flag,看到打印了一句话I will malloc() and strcpy the flag there. take it. IDA看看程序逻辑,shift+ ...

  6. vcenter 不可访问虚拟机

    因为虚拟机找不到路径了,要么是删了,要么阵列顺序乱了什么的. 进入vsphere client: 储存器适配器里扫描一下,或者直接就已经识别了. 进入储存器里,全部扫描一下,或手动添加一下即可.

  7. Python的range()函数用法

    Python的range()函数有三种用法,简单地说就是下图的三种用法: 运行结果如下:

  8. 20164319 刘蕴哲 Exp4:恶意代码分析

    [实验内容] ①系统运行监控 使用如计划任务,每隔一分钟记录自己的电脑有哪些程序在联网,连接的外部IP是哪里.运行一段时间并分析该文件,综述一下分析结果.目标就是找出所有连网的程序,连了哪里,大约干了 ...

  9. js/jquery遇到的坑总结

    1.“removeAttribute is not a function” error message 原因以及解决方法:removeAttribute is a JavaScript DOM fun ...

  10. php中使用sphinx搜索引擎

    sphinx是一个高效的搜索引擎,分词搜索的速度比较快,索引建立存储在硬盘文件,不会干扰数据库,有自己内置的一套数据库. 一. 安装.配置 1.ubuntu安装sphinx 如果没有安装aptitud ...