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算法在严蔚敏树上有解释,但是都是数学语言,很 ...
随机推荐
- JsonWebToken
概述 如果各位不了解 JWT,不要紧张,它并不可怕. JSON Web Token(JWT)是一个非常轻巧的规范.这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息. 让我们来假想一下一个 ...
- jvm内存增长问题排查简例
jvm内存增长问题排查 排查个jvm 内存占用持续增加的问题,纪录一下,引以为戒. 运维发现应用jvm内存占用在发布后回落,然后持续增高,,dump后分析一下: 占内存的大部分是这种名字相似的bean ...
- Micro- and macro-averages
https://datascience.stackexchange.com/questions/15989/micro-average-vs-macro-average-performance-in- ...
- Mariadb-10.1.22配置项
## These groups are read by MariaDB server.# Use it for options that only the server (but not client ...
- CDN是如何工作的?
CDN的原理非常简单.当浏览器请求一资源时,第一步是做DNS解析,DNS解析就像是从通讯录根据姓名找号码,浏览器发送域名,然后得到DNS服务器返回的IP地址.浏览器通过IP地址和服务器连接并获取资源( ...
- L2-008 最长对称子串 (25 分)
对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11. 输入格式: 输入在一 ...
- 基于BP的B/S架构破解
思路历程: 1.获取用户名 2.获取密码字典 3.使用BP爆破 案例: 管理人员在平时的网络生活中没有良好的个人信息保护,让不法份子有机可乘.例如WordPress等的类似网站使用PHP开发,虽然功能 ...
- webpack 搭建问题汇总
总结一下遇到的问题: 1.这样的警告(The 'mode' option has not been set, webpack will fallback to 'production' for thi ...
- Centos7安装teamviewer 32/64位
centos7安装teamviewer teamviewer安装包,自己去官网下吧,不用找了,估摸着就没有Centos7 64位的 所以直接下centos teamviewer 32位那个rpm包吧 ...
- <------------------字符流--------------------->
FileWriter 字符输出流: 方法: 写入:write 刷新:flush public static void main(String[] args) throws IOException { ...