#include <iostream>
using namespace std;
#define MAXVEX 100
#define INFI 0x3f3f3f
typedef int VexType;
typedef int EdgType;
int visited[MAXVEX];
int D[MAXVEX][MAXVEX];
int P[MAXVEX][MAXVEX];
typedef struct
{ VexType Vexs[MAXVEX];
EdgType arc[MAXVEX][MAXVEX];
int vexnum,edgnum;
}MGraph;
void Create_Graph(MGraph &G)
{
int i,j,k,w;
cout<<"输入图的顶点数和边数"<<endl;
cin>>G.vexnum>>G.edgnum;
for(i=1;i<=G.vexnum;i++)
G.Vexs[i]=i;
for(i=1;i<=G.vexnum;i++)
for(j=1;j<=G.vexnum;j++)
G.arc[i][j]=INFI;
cout<<"输入顶点i,j,及它们间的权值:"<<endl;
for(k=1;k<=G.edgnum;k++)
{
cin>>i>>j>>w;
G.arc[i][j]=w;
G.arc[j][i]=w;
}
}
void dfs(MGraph G,int i)
{ int j;
visited[i]=1;
cout<<G.Vexs[i]<<endl;
for(j=1;j<=G.vexnum;j++)
if(G.arc[i][j]<INFI&&!visited[j])
dfs(G,j);
}
void Floyd(MGraph G)
{ int v,w,k;
for(v=1;v<=G.vexnum;v++)
for(w=1;w<=G.vexnum;w++)
{ D[v][w]=G.arc[v][w];
P[v][w]=w;
}
for(k=1;k<=G.vexnum;k++)
for(v=1;v<=G.vexnum;v++)
for(w=1;w<=G.vexnum;w++)
{ if(D[v][w]>D[v][k]+D[k][w])
{ D[v][w]=D[v][k]+D[k][w];
P[v][w]=P[v][k];
}
}
}
void print(MGraph G)
{ int v,w,k;
for(v=1;v<=G.vexnum;v++)
{ for(w=v+1;w<=G.vexnum;w++)
{ cout<<v<<"->"<<w<<":"<<D[v][w]<<endl;
k=P[v][w];
cout<<v;
while(k!=w)
{ cout<<"->"<<k;
k=P[k][w];
}
cout<<"->"<<w<<endl;
}
cout<<endl;
}
}
int main()
{ MGraph G;
int source,destination,v,w,k;
Create_Graph(G);
cout<<"深度优先搜索为:"<<endl;
dfs(G,1);
Floyd(G);
cout<<endl;
for(int i=1;i<=G.vexnum;i++)
{for(int j=1;j<=G.vexnum;j++)
cout<<P[i][j]<<" ";
cout<<endl;
}
cout<<"输入起点顶点:"<<endl;
cin>>source;
cout<<"输入终点顶点:"<<endl;
cin>>destination;
cout<<source<<"->"<<destination<<"最短路径为:"<<D[source][destination]<<endl;
cout<<source;
k=P[source][destination];
while(k!=destination)
{ cout<<"->"<<k;
k=P[k][destination];
}
cout<<"->"<<destination<<endl;
return 0;
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/298488656cf21e3dfa62fee2e5c99731.png)