求最小生成树(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. frida报错frida.InvalidArgumentError: device not found问题解决方案

    一.问题描述     python安装好frida框架后,在安卓端启动了frida-server,启动要hook的应用,在cmd中执行python脚本,报错frida.InvalidArgumentE ...

  2. iOS中使用block进行网络请求回调

    iOS中使用block进行网络请求回调 HttpRequest.h // // HttpRequest.h // UseBlockCallBack // // Created by Michael o ...

  3. 谈谈集合.Map

    本文来谈谈我们平时使用最多的HashMap. 1. 简介 HashMap是我们在开发过程中用的最多的一个集合结构,没有之一.HashMap实现了Map接口,内部存放Key-Value键值对,支持泛型. ...

  4. 黑科技神器-uTools

    Hello,各位小伙伴们好,又到周末了,小黑哥给大家分享一款神器:『utools』. 官网地址:https://u.tools/ uTools 是一个极简.插件化.跨平台的现代桌面软件.通过自由选配丰 ...

  5. Simulink仿真入门到精通(十一) 模块的封装

    当用户编写了自定义的S函数或者使用Simulink标准库中的模块搭建子系统后,可以通过封装为其设计显示外观,追加参数对话框. 封装是构建一个以对话框为接口的交互界面的过程,它将复杂的模块逻辑关系隐藏起 ...

  6. linux php 安装libiconv过程与总结

    问题:在嵌入式linux 已经安装好的php的情景下,需要安装一个扩展库libiconv 背景:从后台传的数据含有中文(gbk2312)的通过json_encode 显示为null,查阅资料发现jso ...

  7. IPv4地址表示法详解

    在TCP/IP协议中,IP地址是一个最基本的概念,本文就来参考<计算机网络>谢希仁 这本书,总结一下IPv4地址表示法的发展阶段,做个读书笔记. IP地址的编址方法共经过了三个历史阶段: ...

  8. cisco应用

    1.修改VLAN show arp:查看设备的ip地址和mac地址的对应关系,一般查看的是设备ARP缓存 show mac-address-table:查看各端口所学习到的MAC show ip ar ...

  9. 动态规划-区间dp-Palindrome Removal

    2019-11-09 10:31:09 问题描述: 问题求解: n = 100,典型的O(n ^ 3)的动规问题.一般来说这种O(n ^ 3)的问题可以考虑使用区间dp来解决. 区间dp是典型的三层结 ...

  10. 99%的程序员都在用Lombok,原理竟然这么简单?我也手撸了一个!|建议收藏!!!

    罗曼罗兰说过:世界上只有一种英雄主义,就是看清生活的真相之后依然热爱生活. 对于 Lombok 我相信大部分人都不陌生,但对于它的实现原理以及缺点却鲜为人知,而本文将会从 Lombok 的原理出发,手 ...