为下图建立邻接矩阵存储结构,并对实验所建立的邻接矩阵进行深度优先遍历。/验证实验/

 #include<stdio.h>

#include<iostream.h>
#define MAX 100
#define N 100


/**************************************************************************/


typedef struct 
{
char v[N];
}V;


typedef struct //邻接矩阵
{   
V v[MAX];//存结点信息
V e[MAX];//存边信息
int ed[MAX][MAX];//边的权信息的数组
    int ves;//结点数
    int edge;//边数
    int invited[MAX];//标志判断是否有被访问过 
}MGraph;
 


void createMGraph(MGraph *G) //创建邻接矩阵 
{
    printf("请分别输入要访问的城市个数和总共的道路数:\n");
    cin>>G->ves>>G->edge;
printf("定义一个起始城市,输入它,从它开始,按自己规定的顺序依次输入其余城市名称:\n");
for(int k = 0; k < G->ves; k++)
scanf("%s",G->v[k].v);   
    printf("请从你定义的起始城开始,输入它以及它所连接的城市以及他们之间的距离:\n");
    for(int l = 0; l < G->edge; l++ )
scanf("%s",G->e[l].v); 
for(int i=0 ; i<G->ves ;  i++) //图的初始化
        for(int j=0; j<G->ves ; j++)
            { 
            if(i==j)
                G->ed[i][j]=0;
            else 
                G->ed[i][j]=32767;
            }
int vi,vj,w;
for(int z=0; z<G->edge ; z++)
    { 
        printf("请输入边的信息i,j,w(以空格分隔):");
        scanf("%d%d%d",&vi,&vj,&w); 
        //若为不带权值的图,则w输入1
        //若为带权值的图,则w输入对应权值


        G->ed[vi-1][vj-1]=w;//①
        G->ed[vj-1][vi-1]=w;//②
        //无向图具有对称性的规律,通过①②实现
        //有向图不具备此性质,所以只需要①
    }
}


void DispGraph(MGraph G) //输出邻接矩阵的信息

    int i,j;
    printf("\n输出邻接矩阵:\n");
    printf("\t");


    for(i=0;i<G.ves;i++)
    { 
        printf("\n%8d",i+1);
        for(j=0;j<G.ves;j++)
        { 
        if(G.ed[i][j]==32767) 
        //两点之间无连接时权值为默认的32767,在无向图中一般用"0"表示,在有向图中一般用"∞",这里为了方便统一输出 "∞"
            printf("%8s", "∞");
        else
            printf("%8d",G.ed[i][j]);
        }
        printf("\n");   
    }
}








void visit(MGraph *G,int i)
{  
cout<<"第"<<i+1<<"个城市:"<<G->v[i].v<<endl;
if(++i==G->ves)
{
cout<<"存在道路"<<G->edge<<"条,如下所示:\n";
for(int z = 0; z < G->edge ; z++)
cout<<"第"<<z+1<<"条道路为:"<<G->e[z].v<<endl;
if(G->e[z].v=='\0')
cout<<"\n";
}
}
void dfs(MGraph *G)//深度优先遍历
{   
    for(int i = 0; i < G->ves; i++)
    {
       if(G->invited[i] == 0)//如果该结点没有访问过
       {
           G->invited[i] = 1;//被访问过的结点置为1 
           visit(G,i);
  dfs(G);
       }
}



/*void visit()
{
cout<<"这里是**城市";
cout<<"这里的著名景点有**"<<"这里有什么一定要吃的美食"<<"...";
    cout<<"在本人的旅行计划里:"<<"要到达该城市共有*条路径,包括:\n"<<"xxx...";
cout<<"其中,路径最短的是:**\n"<<"沿途风景最美的是:**\n";
}*/


void main()
{ printf("1:以邻接矩阵为储存方式的深度优先搜索\n"); 
           MGraph L={"0","0",0,0,0,0};
                    printf("现在开始构建邻接矩阵!\n");
                    createMGraph(&L);
DispGraph(L);
                    printf("现在开始Depth-First-Search!\n");
                    dfs(&L); 
        

}

大同 北京 济南 郑州 西安 太原 石家庄
大同—北京,其间距离379 大同—太原,其间距离355 北京—济南,其间距离298 北京—石家庄,其间距离283 济南—郑州,其间距离615 济南—石家庄,其间距离298 郑州—西安,其间距离620 郑州—石家庄,其间距离412 西安—太原,其间距离1554 西安—石家庄,其间距离1552 太原—石家庄,其间距离340 
1 2 379 1 6 355 2 3 298 2 7 283 3 4 615 3 6 298 4 5 620 4 7 412 5 6 1554 5 7 1552 6 7 340
//队列
2 379 0
6 355 1
3 298 0
7 283 1
4 615 0
6 298 1
5 620 0
7 412 1
6 1554 0
7 1552 1
7 340 1

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愿你温暖喜悦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值