数据结构书上面的代码太复杂了,笔者直接简化来写
#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;
}