DS图--最小生成树
题目描述
根据输入创建无向网。分别用Prim算法和Kruskal算法构建最小生成树。(假设:输入数据的最小生成树唯一。)
输入
顶点数n
n个顶点
边数m
m条边信息,格式为:顶点1 顶点2 权值
Prim算法的起点v
输出
输出最小生成树的权值之和
对两种算法,按树的生长顺序,输出边信息(Kruskal中边顶点按数组序号升序输出)
样例输入
样例输出
#include<iostream>
using namespace std;
struct{
string adjvex;
int lowcost;
}closedge[];
class MGraph
{
public:
int graph[][],graph1[][];
int n,len; //n 是节点个数 len是边的数
int visited[],low[];
string *q;//存节点
string start;
int startpos;
MGraph(){};
void SetMGraph()
{
int i,j;
cin>>n;
for(i=;i<;i++)
for(j=;j<;j++)
{
graph[i][j]=; //将每个权值置为最大
graph1[i][j]=;
} q=new string[n];
for(i=;i<n;i++)
cin>>q[i];
cin>>len;
for(i=;i<=len;i++)
{
string ch1,ch2;
int weight;
cin>>ch1>>ch2>>weight;
int loc1,loc2;
for(j=;j<n;j++)
{
if(q[j]==ch1)
loc1=j;
if(q[j]==ch2)
loc2=j;
}
graph1[loc1][loc2]=graph[loc1][loc2]=weight;
graph1[loc1][loc2]=graph[loc2][loc1]=weight;//无向图
}
cin>>start;
for(i=;i<n;i++)
if(q[i]==start)
startpos=i;
}
void prim()
{
int i,j;
for(i=;i<=n;i++)
visited[i]=;
visited[startpos]=;
int min;
for(i=;i<n;i++)
{
min=;
for(j=;j<n;j++)
{
if(graph[i][j]<min)
{
min=graph[i][j];
closedge[i].adjvex=q[j];
closedge[i].lowcost=min;
}
}
}
string s3;
string *e1,*e2;
int *w3;
e1=new string[];
e2=new string[];
w3=new int[];
int index,k=;
for(i=;i<n;i++)
{
min=;
for(j=;j<n;j++)
{
if(!visited[j])
continue;
else
{
if(min>closedge[j].lowcost)
{
min=closedge[j].lowcost;
s3=closedge[j].adjvex;
index=j;
}
}
}
e1[k]=q[index];e2[k]=s3,w3[k++]=min;
for(int g=;g<n;g++)
{
if(q[g]==s3)
{
visited[g]=;
// graph[index][g]=99999;
// graph[g][index]=99999;
break;
}
}
for(int g=;g<n;g++)
{
min=;
for(int m=;m<n;m++)
{
if(min>graph[g][m] && visited[m]==)
{
min=graph[g][m];
closedge[g].adjvex=q[m];
closedge[g].lowcost=min;
}
}
}
}
int weight=;
for(i=;i<k-;i++)
{
weight+=w3[i];
}
cout<<weight<<endl;
cout<<"prim:"<<endl;
for(i=;i<k-;i++)
cout<<e1[i]<<" "<<e2[i]<<" "<<w3[i]<<endl;
}
void kruskal()
{
cout<<"kruskal:"<<endl;
int *uni=new int[n];
for(int i=;i<n;i++)
{
uni[i]=i;
}
for(int i=;i<n-;i++)
{
int min=;int x,y;
for(int j=;j<n;j++)
{
for(int l=;l<n;l++)
{
if(j==l)
continue;
if(uni[j]==uni[l])
continue;
else
{
if(min>graph1[j][l])
{
min=graph1[j][l];
x=j;y=l;
} }
}
}
graph1[x][y]=;graph1[y][x]=;
if(x>y)
int k;k=x;x=y;y=k; for(int i=;i<n;i++)
{
if(uni[i]==uni[y]&&i!=y) uni[i]=uni[x];
}
uni[y]=uni[x];
cout<<q[x]<<" "<<q[y]<<" "<<min<<endl;
}
}
void show()
{
int i,j;
for(i=;i<n;i++)
{
for(j=;j<n;j++)
cout<<graph[i][j]<<" ";
cout<<endl;
}
}
};
int main()
{
MGraph m,M;
m.SetMGraph();
m.prim();
m.kruskal();
}
DS图--最小生成树的更多相关文章
- DS图遍历--深度优先搜索
DS图遍历--深度优先搜索 题目描述 给出一个图的邻接矩阵,对图进行深度优先搜索,从顶点0开始 注意:图n个顶点编号从0到n-1 代码框架如下: 输入 第一行输入t,表示有t个测试实例 第二行输入n, ...
- 图-最小生成树算法之Kruskal及其Java实现
1.Kruskal算法 Kruskal算法基于贪心,因此它追求的是近似最优解,也就是说由Kruskal得出的生成树并不一定是最优解. Kruskal算法求最小生成树的关键在于,每次选取图中权值最小(及 ...
- ACM程序设计选修课——Problem E:(ds:图)公路村村通(Prim)
问题 E: (ds:图)公路村村通 时间限制: 1 Sec 内存限制: 128 MB 提交: 9 解决: 5 题目描述 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本, ...
- ACM程序设计选修课——Problem F:(ds:图)旅游规划(优先队列+SPFA)
问题 F: (ds:图)旅游规划 时间限制: 1 Sec 内存限制: 128 MB 提交: 14 解决: 4 题目描述 有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路 ...
- 数据结构学习笔记05图(最小生成树 Prim Kruskal)
最小生成树Minimum Spanning Tree 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边. 树: 无回路 |V|个顶 ...
- poj 3026 Borg Maze bfs建图+最小生成树
题目说从S开始,在S或者A的地方可以分裂前进. 想一想后发现就是求一颗最小生成树. 首先bfs预处理得到每两点之间的距离,我的程序用map做了一个映射,将每个点的坐标映射到1-n上,这样建图比较方便. ...
- BZOJ 4242 水壶(BFS建图+最小生成树+树上倍增)
题意 JOI君所居住的IOI市以一年四季都十分炎热著称. IOI市是一个被分成纵H*横W块区域的长方形,每个区域都是建筑物.原野.墙壁之一.建筑物的区域有P个,编号为1...P. JOI君只能进入建筑 ...
- 算法学习记录-图——最小生成树之Kruskal算法
之前的Prim算法是基于顶点查找的算法,而Kruskal则是从边入手. 通俗的讲:就是希望通过 边的权值大小 来寻找最小生成树.(所有的边称为边集合,最小生成树形成的过程中的顶点集合称为W) 选取边集 ...
- 算法学习记录-图——最小生成树之prim算法
一个连通图的生成树是一个极小的连通子图,它包含图中全部的顶点(n个顶点),但只有n-1条边. 最小生成树:构造连通网的最小代价(最小权值)生成树. prim算法在严蔚敏树上有解释,但是都是数学语言,很 ...
随机推荐
- SQL*Plus连接符拼接输出
在日常工作中,可能需要使用重复的命令,修改的只是某个不同字段的值,可以使用连接字符串进行拼接 #本篇文档: 一.使用连接符拼接SQL 二.Spool输出查询结果 三.Spool输出xml/ html ...
- golang图片裁剪和缩略图生成
直接贴代码了 package main import ( "errors" "fmt" "image" "image/gif&qu ...
- 牛客HJ浇花。
我也不知道这是什么类型的题,算是简单模拟吧.但是有个方法很赞. 开两个数组,一个模拟花,一个记录不同浇花次数花的数量: 要找浇水的次数,那么记每次浇水的开头和结尾就行了,a—b;那么f[a]++;f[ ...
- POJ 3468:A Simple Problem with Integers(线段树区间更新模板)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 141093 ...
- php-isset和empty
<?php $a = null; if(isset($a)){ echo "is set"."\n"; } else{ echo "not se ...
- 小白python 安装
小白python 安装: https://blog.csdn.net/qq_36667170/article/details/79275605 https://blog.csdn.net/nmjuzi ...
- golang 内存占用测量
web服务中加入如下 import ( "runtime" "time" "fmt" ) go func() { for { var m r ...
- 快速挂载iso文件到虚拟机系统
在vm软件菜单栏那里选择vm,再选择弹出菜单最下面的设置,如图,找到实体机上的iso文件,保存. 这时候,在虚拟机ls /dev会发现有一个cdrom,这个就是我们的iso文件,不过我们还需要把它挂载 ...
- MySQL Replication--全局参数gtid_executed和gtid_purged
参数定义gtid_executed,全局参数,GTID集合包含所有在该服务器上执行过的事务编号和使用set gtid_purged语句设置过的事务编号,使用SHOW MASTER STATUS和SHO ...
- Laya学习
IDE安装 https://www.jianshu.com/p/88fa76a5becc npm uninstall -g typescript npm install -g typescript@2 ...