求最小生成树(Prim算法)

我对提示代码做了简要分析,提示代码大致写了以下几个内容

  1. 给了几个基础的工具,邻接表记录图的一个的结构体,记录Prim算法中最近的边的结构体,记录目标边的结构体(始末点,值)。
  2. 初始化记录了图,规定了从0号节点开始构建。

    给了这么多东西,不能不用,对吧,下面就是题目以及算法

1000(ms) 10000(kb) 2490 / 4945

Tags: 生成树

求出给定无向带权图的最小生成树。图的定点为字符型,权值为不超过100的整形。在提示中已经给出了部分代码,你只需要完善Prim算法即可。

#include< iostream>
using namespace std; typedef struct
{
int n; //节点数
int e; //边数
char data[500]; //节点对应的字母
int edge[500][500]; //图的数据
}Graph;
//可以说图的所有信息都在这里了 typedef struct
{
int index;
int cost;
}mincost; //记录最小值边用的 typedef struct
{
int x;
int y;
int weight;
}EDGE; //找到最小边以后可以用这个保存边的数据 typedef struct
{
int index;
int flag;
}F; //没懂拿来干嘛 //一个形成图的函数。对角存为0(无边连接自己),其他存为100
void create(Graph &G,int n ,int e)
{
int i,j,k,w;
char a,b;
for(i=0;i< n;i++)
cin>>G.data[i];
for(i=0;i< n;i++)
for(j=0;j< n;j++)
{
if(i==j)
G.edge[i][j]=0;
else
G.edge[i][j]=100;
} for(k=0;k< e;k++)
{
cin>>a;
cin>>b;
cin>>w;
for(i=0;i< n;i++)
if(G.data[i]==a) break;
for(j=0;j< n;j++)
if(G.data[j]==b) break; G.edge[i][j]=w;
G.edge[j][i]=w;
}
G.n=n;
G.e=e;
} void Prim(Graph &G,int k)
{ //完成Prim算法 } int main()
{
Graph my;
int n,e;
cin>>n>>e;
create(my,n,e);
Prim(my,0);
return 0;
}

输入

第一行为图的顶点个数n第二行为图的边的条数e接着e行为依附于一条边的两个顶点和边上的权值

输出

最小生成树中的边。

样例输入

6

10

ABCDEF

A B 6

A C 1

A D 5

B C 5

C D 5

B E 3

E C 6

C F 4

F D 2

E F 6

样例输出

(A,C)(C,F)(F,D)(C,B)(B,E)

ok,先说我的思路:

  • 大致描述为,循环n-1次(n-1个边),每次找一个边
  • 遍历所有遍历过的节点,找与所有节点连接的节点,(未被遍历过,这样符合逻辑,同时避免回路)两节点形成的边中值最小的边(从已知节点中找与已经构成的连接最近的节点)
  • 输出这个边,并重置记录最小值的变量,记录新节点已遍历

其中,用visited[]数组来标识节点是否已经遍历,

,

#include<iostream>
using namespace std; typedef struct
{
int n;
int e;
char data[500];
int edge[500][500];
}Graph; typedef struct
{
int index;
int cost;
}Mincost; typedef struct
{
int x;
int y;
int weight;
}EDGE; typedef struct
{
int index;
int flag;
}F; void create(Graph &G,int n ,int e)
{
int i,j,k,w;
char a,b;
for(i=0;i< n;i++)
cin>>G.data[i];
for(i=0;i< n;i++)
for(j=0;j< n;j++)
{
if(i==j)
G.edge[i][j]=0;
else
G.edge[i][j]=100;
} for(k=0;k< e;k++)
{
cin>>a;
cin>>b;
cin>>w;
for(i=0;i< n;i++)
if(G.data[i]==a) break;
for(j=0;j< n;j++)
if(G.data[j]==b) break; G.edge[i][j]=w;
G.edge[j][i]=w;
}
G.n=n;
G.e=e;
} void Prim(Graph &G,int k)
{
Mincost mincost;
EDGE edge;
int visited[G.n];
for(int i=0;i<G.n;i++)
{
visited[i]=0;
}
mincost.cost=99999;
mincost.index=0;
visited[k]=1;
//G.n-1个边,找G.n-1次
for(int i=k;i<G.n-1;i++)
{
//从第一个节点连接的节点开始找目标节点
for(int j=0;j<G.n;j++)
{
if(visited[j]==1)//已经构造的图中有此节点
{
for(int l=0;l<G.n;l++)
{
if(G.edge[j][l]!=0)//有该边
{
if(visited[l]==0)//该节点未被遍历过
{
if(G.edge[j][l]<mincost.cost)//是更小的边,更小哦
{
mincost.index=l;
mincost.cost=G.edge[j][l];
edge.weight=G.edge[j][l];
edge.x=j;
edge.y=l;
}
}
}
}
}
}
//输出,保存,重置
visited[mincost.index]=1;
cout<<'('<<G.data[edge.x]<<','<<G.data[edge.y]<<')';
mincost.cost=99999;
mincost.index=0;
}
} int main()
{
Graph my;
int n,e;
cin>>n>>e;
create(my,n,e);
Prim(my,0);
return 0;
}

SWUST OJ 1075 求最小生成树(Prim算法)的更多相关文章

  1. 求最小生成树(Prim算法)(1075)

    Description 求出给定无向带权图的最小生成树.图的定点为字符型,权值为不超过100的整形.在提示中已经给出了部分代码,你只需要完善Prim算法即可. Input 第一行为图的顶点个数n    ...

  2. swust oj 1075

    求最小生成树(Prim算法) 1000(ms) 10000(kb) 2251 / 4487 Tags: 生成树 求出给定无向带权图的最小生成树.图的定点为字符型,权值为不超过100 的整形.在提示中已 ...

  3. 最小生成树Prim算法(邻接矩阵和邻接表)

    最小生成树,普利姆算法. 简述算法: 先初始化一棵只有一个顶点的树,以这一顶点开始,找到它的最小权值,将这条边上的令一个顶点添加到树中 再从这棵树中的所有顶点中找到一个最小权值(而且权值的另一顶点不属 ...

  4. 最小生成树—prim算法

    最小生成树prim算法实现 所谓生成树,就是n个点之间连成n-1条边的图形.而最小生成树,就是权值(两点间直线的值)之和的最小值. 首先,要用二维数组记录点和权值.如上图所示无向图: int map[ ...

  5. 图论算法(五)最小生成树Prim算法

    最小生成树\(Prim\)算法 我们通常求最小生成树有两种常见的算法--\(Prim\)和\(Kruskal\)算法,今天先总结最小生成树概念和比较简单的\(Prim\)算法 Part 1:最小生成树 ...

  6. 最小生成树,Prim算法与Kruskal算法,408方向,思路与实现分析

    最小生成树,Prim算法与Kruskal算法,408方向,思路与实现分析 最小生成树,老生常谈了,生活中也总会有各种各样的问题,在这里,我来带你一起分析一下这个算法的思路与实现的方式吧~~ 在考研中呢 ...

  7. 【ACM程序设计】最小生成树 Prim算法

    最小生成树 ● 最小生成树的定义是给定一个无向图,如果它任意两个顶点都联通并且是一棵树,那么我们就称之为生成树(Spanning Tree).如果是带权值的无向图,那么权值之和最小的生成树,我们就称之 ...

  8. 数据结构代码整理(线性表,栈,队列,串,二叉树,图的建立和遍历stl,最小生成树prim算法)。。持续更新中。。。

    //归并排序递归方法实现 #include <iostream> #include <cstdio> using namespace std; #define maxn 100 ...

  9. Highways POJ-1751 最小生成树 Prim算法

    Highways POJ-1751 最小生成树 Prim算法 题意 有一个N个城市M条路的无向图,给你N个城市的坐标,然后现在该无向图已经有M条边了,问你还需要添加总长为多少的边能使得该无向图连通.输 ...

随机推荐

  1. 304 Not Modified

    304 Not Modified,不是服务器发出的错误,是服务器所承载的业务系统在开发时为了节省带宽和提升浏览器的体验,对GET/js,css,image等执行了缓存机制.客户端第一次对服务器发出GE ...

  2. SpringBoot入门系列(五)Thymeleaf的常用标签和用法

    前面介绍了Spring Boot 中的整合Thymeleaf .不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/category/16577 ...

  3. mongoose基本增删改查

    1.安装 打开命令行 npm i mongoose 2.连接数据库 // 引入安装的包 var mongoose = require('mongoose'); mongoose.connect('mo ...

  4. linux-TFTP服务

    1.TFTP协议简介TFTP,全称是 Trivial File Transfer Protocol(简单文件传输协议),基于 UDP 实现,该协议简单到只能从远程服务器读取数据或向远程服务器上传数据. ...

  5. ASP.NET Core 中jwt授权认证的流程原理

    目录 1,快速实现授权验证 1.1 添加 JWT 服务配置 1.2 颁发 Token 1.3 添加 API访问 2,探究授权认证中间件 2.1 实现 Token 解析 2.2 实现校验认证 1,快速实 ...

  6. Core + Vue 后台管理基础框架1——运行系统

    1.down源码 git clone https://github.com/KINGGUOKUN/SystemManagement.git,项目目录如下: 2.还原数据库 找到项目根目录下System ...

  7. Spark实战--搭建我们的Spark分布式架构

    Spark的分布式架构 如我们所知,spark之所以强大,除了强大的数据处理功能,另一个优势就在于良好的分布式架构.举一个例子在Spark实战--寻找5亿次访问中,访问次数最多的人中,我用四个spar ...

  8. (转)嵌入式linux系统开发过程中遇到的——volatile

    原文地址:http://blog.csdn.net/HumorRat/article/details/5631023 对于不同的计算机体系结构,设备可能是端口映射,也可能是内存映射的.如果系统结构支持 ...

  9. Docker基本概念及架构

    一.Docker基本概念 Docker是一个开源的容器引擎,基于Go 语言并遵从 Apache2.0 协议开源.Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布 ...

  10. liunx 安装 zookeeper(转)

    转自:https://www.cnblogs.com/expiator/p/9853378.html linux安装zookeeper及使用 一.安装条件 想要安装zookeeper,必须先在linu ...