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算法在严蔚敏树上有解释,但是都是数学语言,很 ...
随机推荐
- 2017 乌鲁木齐赛区网络赛 J Our Journey of Dalian Ends 费用流
题目描述: Life is a journey, and the road we travel has twists and turns, which sometimes lead us to une ...
- 改变radio单选按钮的样式
<div class="choose_btn"> <input type="radio" name="choose_raido&qu ...
- resNet代码-小象/cv
C:\yyy\ml\dengsong\ChinaHadoop\ChinaHadoop_C4-master\ChinaHadoop_C4-master\C4_ResNet_TF http://blog. ...
- UE4 C++ Tips
篇写的是关于UE4的C++方面的小技巧: 1.在构造函数里 //构建组件 RootComponent = CreateDefaultSubobject<USceneComponent>(T ...
- (4)MySQL的外键(不同表之间的数据关联)
问题:下列这张表中部门等列名下输入的数据没有约束,那么可以随便填写符合规则的数据但是不符合实际需求的值,这样就造成了不符合规则的数据在表中存在,外键就是为了解决这个问题,管理员可以在另一张表中设置好符 ...
- mac-内置截图-snapshot
mac截图快捷键
- curl提示不支持https协议解决方法
根据网上的资料,这个问题的原因是因为在安装curl时使用默认安装,但是默认安装并不支持https协议 简单粗暴的办法就是,卸载重新安装curl(有一种方法是重新编译就可以了,然后使用编译后的可执行文件 ...
- centos7/linux 磁盘管理入门
添加新磁盘并挂载: 设置虚拟机系统里添加磁盘,重启虚拟机后,虚拟机目录/dev下会增加一个sdb设备. 使用fdisk /dev/sdb 管理磁盘分区,首先p 查看磁盘分区信息,然后n增加一个主分区, ...
- Cassandra--JAVA访问Cassandra数据
JAVA创建Cluster对象 cluster = Cluster.builder() .addContactPoints(contactPoints) .withRetryPolicy(new Lo ...
- day 55 jQuery 之事件 绑定等
属性选择器: [attribute] [attribute=value]// 属性等于 列入 $("input[value='male']").prop('chekced') 注意 ...