求最小生成树(Prim算法)

1000(ms)

10000(kb)

2256 / 4495

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;

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)
#include<iostream>
#include<stdio.h>//新加的头文件
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 v) //将k改为v;
{ int lowcost[100];//用来储存相应序号的最短长度 int min;//用来标记长度 int closest[100],i,j,k;//closest作为标记,并且记录相应的点 for(i=0;i<G.n;i++)//将v=0,放入到树中,将到其他点到0点的长度依次储存在lowcost中 {lowcost[i]=G.edge[v][i];closest[i]=v;//将所有标记都赋值为0,并且将closest【0】赋值为相应的序号0! }  for(i=1;i<G.n;i++)//已经将0点放入到树中,还有G.n-1个点需要放入,所以从 i=1开始 {min=100;//初始化min for(j=0;j<G.n;j++)//找出到放入树中的点的长度中最短的长度,并且用k记录该点 {if(lowcost[j]!=0&&lowcost[j]<min){min=lowcost[j];k=j;}}printf("(%c,%c)",closest[k]+'A',k+'A');//输出边,因为用相应的数字储存的,但是要输出字符,所以加上A的ascll码,即为相应的字母 lowcost[k]=0;//k点到树的长度标记为0,避免重复 ,并且k为刚放入树中的点 for(j=0;j<G.n;j++){if(lowcost[j]!=0&&G.edge[k][j]<lowcost[j])//遍历刚放入树中的k那一行中是否有更短到树的长度 {lowcost[j]=G.edge[k][j];//如果有,则将那个点到k点的长度储存在lowcost中对应位置 closest[j]=k;//将closest对应位置储存 相应序号。 }}}
}
int main()
{ Graph my; int n,e; cin>>n>>e; create(my,n,e); Prim(my,0);    return 0;
}
/*
#include<stdio.h>
int n;int map[100][100]={0};//初始化图
char str[100];int queue[100];
void Prim(int top)//top为队的长度
{if(top<n){int min=100,x,y;//初始化min的值,用来查找最小权重 for(int i=0;i<top;i++){for(int j=0;j<n;j++){if(map[queue[i]][j]<min&&map[queue[i]][j]!=0)//依次遍历队中的点对应的行 如果不为0,并且小于min,则改变min的值,并且记录行和列 {min=map[queue[i]][j];x=queue[i];y=j;}}}for(int k=0;k<n;k++)//将能到达y点的图标记为0 ,避免重复  {map[k][y]=0;}printf("(%c,%c)",str[x],str[y]);//输出边,即记录的行和列 queue[top++]=y;//并且将其入队 map[x][y]=0;//将该点的图标记为0,并且将其反向的点的图也标记为0 map[y][x]=0;Prim(top);//继续递归直到所有的点都入队为止 }
}
int main()
{int e;scanf("%d",&n);scanf("%d",&e);scanf("%s",str);for(int i=0;i<e;i++){char a,b;int data;getchar();//抵消回车字符 scanf("%c %c %d",&a,&b,&data);map[a-'A'][b-'A']=data;//将字符结点变成相应的序号结点,并且创建无向图 map[b-'A'][a-'A']=data;}queue[0]=0;//将0点入队 ,从0行开始遍历 for(int k=0;k<n;k++)//将到达0点的图标记为0,避免重复 {map[k][0]=0;}Prim(1);//1位当前队的长度
}
*/

西南科技大学OJ题 求最小生成树(Prim算法)1075相关推荐

  1. 西南科技大学OJ题 邻接矩阵到邻接表1055

    邻接矩阵到邻接表 5000(ms) 10000(kb) 2341 / 5552 假设无向图G采用邻接矩阵存储,编写一个算法输出邻接表. 输入 第一行为一个整数n,表示顶点的个数(顶点编号为0到n-1) ...

  2. 西南科技大学OJ题 邻接矩阵存储简单路径1070

    邻接矩阵存储简单路径 5000(ms) 10000(kb) 2197 / 4175 Tags: 邻接矩阵 假设无向图G采用邻接矩阵存储,设计一个算法,输出图G中从顶点u到v的所有简单路径. 输入 简单 ...

  3. 西南科技大学OJ题 哈夫曼译码0986

    哈夫曼译码 1000(ms) 10000(kb) 1974 / 4142 通常要求根据给定的编码本对密文进行解码.现已给定相应字符的哈夫曼编码,要求根据编码对密文进行解码.(建立哈夫曼树以及编码.主函 ...

  4. 西南科技大学OJ题 顺序表插入操作的实现0943

    顺序表插入操作的实现 建立长度为n的顺序表,在指定的数据元素item之前插入数据元素data.如果指定的数据元素item不存在,则将data插入到顺序表的尾端.(数据类型为整型) 输入 第一行为顺序表 ...

  5. 西南科技大学OJ题 单链表的删除操作的实现0953

    单链表的删除操作的实现 1000(ms) 65535(kb) 2896 / 13622 建立长度为n的单链表,删除第i个结点之前的结点. 输入 第一行为自然数n,表示链式线性表的长度: 第二行为n个自 ...

  6. 西南科技大学OJ题 above average 0706

    above average 1000(ms) 65535(kb) 1531 / 3045 It is said that 90% of frosh expect to be above average ...

  7. D-OJ刷题日记:使用邻接矩阵实现最小生成树Prim算法 题目编号:1135

    理解: [理解prim算法本质--让一棵小树逐渐长大] Prim算法:又称为加边法,即每次选择最小权值的边加入到生成树中,然后再更新权值,如此反复,保证每次最优来达到最优解. Prim算法生成树用的是 ...

  8. 最小生成树 - Prim算法

    最小生成树 - Prim算法 思路: 采用 贪心策略,每次选取连通块外延的最短边和对应的点放入连通块,再更新新的连通块外延的边.连通部分逐渐扩大,最后将整个图连通起来,并且边长之和最小. 时间复杂度: ...

  9. [Java学习] 最小生成树——Prim算法

    文章目录 最小生成树 Prim算法流程 应用实例 求最小生成树 最小生成树 百度百科上对于最小生成树的定义是这样的:一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结 ...

最新文章

  1. ElasticSearch(六) Update API
  2. java url 根域名_php中取得URL的根域名的代码
  3. html中设置父盒子的高度,【CSS】设置浮动元素高度等于父元素
  4. windows下使用Python出现No module named tkinter.ttk
  5. <<温泉屋的小老板娘>>观后感
  6. 使用svnsync同步svn
  7. 清华毕业生做保姆,那又如何呢
  8. 游戏视觉控壁纸党可以开始行动!
  9. Java MyBatis 别名
  10. delphi语言转为汇编语言_计算机语言
  11. Perl连接Oracle数据库的一些操作脚本【转】
  12. 虚拟参考站(VRS)
  13. jQuery 页面载入进度条收藏
  14. 工厂模式的思想主要为
  15. python中raise stoplteration_Python 中的异常处理
  16. GitLab(三)创建用户
  17. 如何在国外进行自然科学研究
  18. 抖音小店商品如何挂到精选联盟上面?带货有什么技巧方法?
  19. MySQL之按日期查询表数据
  20. 采用最终一致性解决微服务一致性问题

热门文章

  1. 微信小程序 - 下载文件到本地、打开文档
  2. 计算机组成原理实验心得200字,2016年江西师范大学考研专业目录及考试科目
  3. linux cc攻击
  4. 告别Anaconda: Pycharm最简单的通过pip下载python包的方法(没有之一)
  5. 放弃谷歌实习转投ICC,我是如何曲线上岸G家的?
  6. 现代操作系统(1.引论)
  7. 淘宝开放平台基础DEMO下载
  8. delphi 7连接oracle数据库问题
  9. c语言中fbfd函数,FBFD
  10. InterSystems 2022全球峰会亮点解读:Smart Data Fabric与InterSystems数据平台的超能力