(数据结构)图的邻接矩阵创建+DFS遍历(字符串顶点)

这篇博客介绍了如何用C++简化数据结构书中的代码,实现无向带权图的创建、深度优先搜索(DFS)和图的输出。示例代码展示了从用户输入构建图,然后进行DFS遍历并将结果输出到控制台和文件中。DFS遍历用于遍历图中所有未访问过的节点及其子节点。
摘要由CSDN通过智能技术生成

数据结构书上面的代码太复杂了,笔者直接简化来写

#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
const int N=101;
bool vis[N];
typedef struct {
	int nodenum;//节点数
	string nodename[N];//节点名字 
	int acrnum;//边数 
	int arc[N][N];//边权 
}Graph;

int Locatevex(Graph &G,string s){//给出顶点s得到其下标 
	for(int i=0;i<G.nodenum;i++) {
		if(s==G.nodename[i]) return i;
	}
}
void Create(Graph &G){//创建一个无向带权图 
	
	printf("输入节点数和边数:\n");
	scanf("%d%d",&G.nodenum,&G.acrnum);
	for(int i=0;i<G.nodenum;i++)//初始化每两个点之间距离为无穷大 
		for(int j=0;j<G.nodenum;j++) G.arc[i][j]=INF;
	printf("输入%d个节点名字\n",G.nodenum);
	for(int i=0;i<G.nodenum;i++) cin>>G.nodename[i]; 
	
	int w;
	printf("输入%d个边及边权\n",G.acrnum); 
	string s1,s2; 
	for(int k=0;k<G.acrnum;k++){
		cin>>s1>>s2>>w;
		int i=Locatevex(G,s1);
		int j=Locatevex(G,s2);
		G.arc[i][j]=G.arc[j][i]=w; //无向图两点距离相等 
	}
	return ;
} 
void DFS(Graph &G,int i){
	vis[i]=true;
	cout<<G.nodename[i]<<" ";
	for(int j=0;j<G.nodenum;j++){
		if(G.arc[i][j]!=INF&&!vis[j]) DFS(G,j);
	}
}
void DFST(Graph &G){
/*
	DFS的基本思路是通过遍历每个节点,如果它没有访问,就再遍历它的子节点 
	*/
	for(int i=0;i<G.nodenum;i++) vis[i]=false;
	for(int i=0;i<G.nodenum;i++) {
		if(!vis[i]) DFS(G,i);
	}
}
void Output(Graph &G){
	for(int i=0;i<G.nodenum;i++){
		for(int j=0;j<G.nodenum;j++){
			if(G.arc[i][j]==INF) cout<<"INF  ";
			else cout<<G.arc[i][j]<<"     ";
		}
		putchar('\n');
	}
}
int main(){
	Graph G;
	Create(G);
	DFST(G);
	putchar('\n');
	Output(G);
	return 0;
} 
/*
6 5

a b e c d f

a b 2
a c 3
b e 1
c d 4
c f 5

*/

在这里插入图片描述

下面是输出到文件里得(考试要求)

#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
const int N=101;
FILE *fp = fopen("zhengpan.txt", "w");//指针类型全局变量 
bool vis[N];
typedef struct {
	int nodenum;//节点数
	string nodename[N];//节点名字 
	int acrnum;//边数 
	int arc[N][N];//边权 
}Graph;

int Locatevex(Graph &G,string s){//给出顶点s得到其下标 
	for(int i=0;i<G.nodenum;i++) {
		if(s==G.nodename[i]) return i;
	}
}
void Create(Graph &G){//创建一个无向带权图 
	
	printf("输入节点数和边数:\n");
	scanf("%d%d",&G.nodenum,&G.acrnum);
	
	for(int i=0;i<G.nodenum;i++)//初始化每两个点之间距离为无穷大 
		for(int j=0;j<G.nodenum;j++) G.arc[i][j]=INF;
		
	printf("输入%d个节点名字\n",G.nodenum);
	for(int i=0;i<G.nodenum;i++) cin>>G.nodename[i]; 
	
	int w;
	printf("输入%d个边及边权\n",G.acrnum); 
	string s1,s2; 
	for(int k=0;k<G.acrnum;k++){
		cin>>s1>>s2>>w;
		int i=Locatevex(G,s1);//得到s1的下标 
		int j=Locatevex(G,s2);
		G.arc[i][j]=G.arc[j][i]=w;//无向图两点距离相等 
	}
	return ;
} 
void DFS(Graph &G,int i){
	vis[i]=true;
	cout<<G.nodename[i]<<" ";
	fprintf(fp,"%s ",G.nodename[i].c_str());//调用了c_str()函数将string类型的s转化为字符串数组 
	for(int j=0;j<G.nodenum;j++){
		if(G.arc[i][j]!=INF&&!vis[j]) DFS(G,j);
	}
}
void DFST(Graph &G){
	/*
	DFS的基本思路是通过遍历每个节点,如果它没有访问,就再遍历它的子节点 
	*/
	for(int i=0;i<G.nodenum;i++) vis[i]=false;
	for(int i=0;i<G.nodenum;i++) {
		if(!vis[i]) DFS(G,i);
	}
}
void Output(Graph &G){
	for(int i=0;i<G.nodenum;i++){
		for(int j=0;j<G.nodenum;j++){
			if(G.arc[i][j]==INF)  {
				printf("INF  ");
				fprintf(fp,"INF  ");
			}
			else{
				 printf("%d   ",G.arc[i][j]);
				 fprintf(fp,"%d   ",G.arc[i][j]);
			}
		
		}
		putchar('\n');
		fprintf(fp,"\n");
	}
}

int main(){
	
	Graph G;
	Create(G);
	DFST(G);
	putchar('\n');
	fprintf(fp,"\n");
	Output(G);
	fclose(fp);
	return 0;
} 



在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Nap!

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

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

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

打赏作者

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

抵扣说明:

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

余额充值