问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

c语言 数据结构编程 图状结构的应用

发布网友 发布时间:2022-04-29 07:33

我来回答

2个回答

热心网友 时间:2022-06-21 04:39

#include <iostream>
#include <fstream>
using namespace std;
class edgeset{
public:
int from;//边起始点
int end;//边终止点
int w;//边的权值
};//定义一个类用来存放图的边的信息(kruskal算法中用到)

//==============prim算法=============================
void prim(int a[11][11],int (&path)[11][11]){
cout<<"运用prim算法"<<endl;
int i,j,k;
int mini,minj,min,sum=0;
a[0][0]=-1;
cout<<"通道铺设情况:(0-10分别对应点a-k)"<<endl;
for(k=1;k<11;k++){
min=100;
for(i=0;i<11;i++){
for(j=0;j<11;j++){
if(a[i][i]+a[j][j]==-1 && a[i][j]>0 && a[i][j]<min){
min=a[i][j];
mini=i;
minj=j;
}
}
}
if(a[mini][mini]==-1){
cout<<"("<<mini<<","<<minj<<")";
path[mini][minj]=a[mini][minj];
path[minj][mini]=a[mini][minj];
a[minj][minj]=-1;
}
else{
cout<<"("<<mini<<","<<minj<<")";
path[mini][minj]=a[mini][minj];
a[mini][mini]=-1;
path[minj][mini]=a[mini][minj];
}
sum=sum+min;
}
cout<<endl;
cout<<"建设费用为:"<<sum<<endl;
//=============最小生成树的邻接矩阵输出==============
cout<<"最小生成树对应的邻接矩阵为:"<<endl;
for(int x=0;x<11;x++){
for(int y=0;y<11;y++){
cout<<path[x][y]<<" ";
}
cout<<endl;
}
}
//===================================================

//===========kruskal算法=============================
void kruskal(int a[11][11],int(&kpath)[11][11]){
cout<<"运用kruskal算法"<<endl;
int i,j,k,d;
int num=0;
edgeset edge[18];

//将邻接矩阵中权值大于1的边对应的点及权值存到一个边类
for(i=0;i<11;i++){
for(j=i+1;j<11;j++){
if(!a[i][j]==0){
edge[num].from=i;
edge[num].end=j;
edge[num].w=a[i][j];
num++;
}
}
}
edgeset tmp;
//===================================================

//=======将边按权值大小排序==========================
for(i=1;i<18;i++){
for(j=0;j<18-i;j++){
if(edge[j].w>edge[j+1].w){
tmp=edge[j];
edge[j]=edge[j+1];
edge[j+1]=tmp;
}
}
}
//===================================================

int m1,m2;
edgeset c[11];
int s[11][11];
for(i=0;i<11;i++)
for(j=0;j<11;j++){
if(i==j)
s[i][j]=1;
else
s[i][j]=0;
}
k=1;
d=0;
int sum=0;
cout<<"通道铺设情况:(0-10分别对应点a-k)"<<endl;
while(k<11){
for(i=0;i<11;i++){
if(s[i][edge[d].from]==1)
m1=i;
if(s[i][edge[d].end]==1)
m2=i;
}
if(m1!=m2){
c[k-1]=edge[d];
cout<<"("<<c[k-1].from<<","<<c[k-1].end<<")";
kpath[c[k-1].from][c[k-1].end]=c[k-1].w;
kpath[c[k-1].end][c[k-1].from]=c[k-1].w;
sum=sum+c[k-1].w;
k++;
for(j=0;j<11;j++){
if(s[m2][j]!=0){
s[m1][j]=s[m2][j];
s[m2][j]=0;
}
}
}
d++;
}
cout<<endl;
cout<<"建设费用为:"<<sum<<endl;
//=============最小生成树的邻接矩阵输出==============
cout<<"最小生成树对应的邻接矩阵为:"<<endl;
for(int x=0;x<11;x++){
for(int y=0;y<11;y++){
cout<<kpath[x][y]<<" ";
}
cout<<endl;
}
}

void main(){
int h,z;
int a[11][11];
int path[11][11]={0};
//==============数据读入(图的邻接矩阵)=============
ifstream in("picture.txt");
for(h=0;h<11;h++){
for(z=0;z<11;z++){
in>>a[h][z];
}
}
//===================================================
cout<<"图的邻接矩阵:"<<endl;
for(int i=0;i<11;i++){
for(int j=0;j<11;j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
int kpath[11][11]={0};
int b[11][11];
ifstream in2("picture.txt");
for(h=0;h<11;h++){
for(z=0;z<11;z++){
in2>>b[h][z];
}
}
int ch;
cout<<"请选择算法(1:prim算法/2:kruskal算法):";
cin>>ch;
cout<<endl;
switch(ch){
case 1:prim(a,path);//调用prim算法函数
break;

case 2:kruskal(b,kpath);
break;
}
}
//希望对你有所帮助

热心网友 时间:2022-06-21 04:39

这问题需要时间调试,我回去编一下试试
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
找专业防水队做完还漏水怎么维权 法院会受理房屋漏水造成的纠纷吗? 巴西龟最长活多久,家养!!! 养胃的药最好的是什么啊 婴儿积食发烧不愿吃药怎么办 板门穴位在哪个部位 手机设置放偷看的方法? 凝结水回收器生产厂家? 个人账户养老金预测公式:现有5万元,缴费20年,能领多少钱? 临沂比较有名的男装品牌 请大家评论一下《千与千寻》 求C语言大神写一个下题的系统分析和程序结构流程图 千与千寻有没有漫画版 c语言的9种控制结构都有哪些以及45个标准运算符 《千与千寻》究竟是一部怎样的作品? require(),include(),require_once()和include_once()区别 “千与千寻”的内容简介 c语言版数据结构图的一些基本操作函数如下,有三个地方不了解,请各位帮帮忙? 千与千寻有漫画吗 .日本漫画《千与千寻》.《龙猫》等等的作者是谁? C语言软件结构图 宫崎骏漫画《千与千寻的神隐》有什么深层次的含义呢? 日本动漫《千与千寻》讲述了一个什么样的故事? 日本漫画《千与千寻》《龙猫》等等的作者是谁 日本有个漫画里女主角叫千寻、这个漫画名叫什么? 有《千与千寻》这本书吗? 林碧春非洲二女儿现状是什么? 林碧春嫁的国王喜欢腿揣是什么意思? 嫁给非洲总统的林碧春,后来生活怎样? 18岁女孩林碧春,不顾反对嫁给非洲暴君,父母再见时怎样了? 宫崎骏,千与千寻 《千与千寻》的隐喻和它人物的隐喻 千与千寻这漫画蕴含这什么 C语言题目 求解释 软件系统结构图的宽度的意思 寻找千与千寻的作者信息 千与千寻漫画版下载 有没有什么手套是很薄的、带着和没戴似的 有没有一种护手手套,比较薄,质量又好的? 请问大家上班忘记打卡了,怎么填签卡单,满意的我给分 什么材质的手套比较薄又保暖 在小D协同上签卡单怎么作废 我去年有几天下班没打到卡,我没写签卡单自己签了卡,公司说我违反制度 女朋友工作原因,手经常被扎的 带手套的话要带很薄的手套,有没有那样的手套。 上班忘记打卡,怎么写? 在员工之家上怎么补卡 有没有那种比较薄但是防风的骑行手套?自行车 中午十二点没打上卡,签卡时间怎么写 人力资源考勤工作怎么提高工作效率 物流证是什么时候考勤制度2015 有没有超薄型防水的隔热手套啊