实验七 图的操作
一、 实验目的
掌握无向图的创建、遍历方法。
二、 实验内容
1、创建图类,存储结构使用邻接矩阵。
2、输入图的节点数 n(不超过 10 个)、边数 m,节点分别用 1-n 代表。
3、采用“起始节点,终止节点,权值”输入图的 m 条边,创建图。
4、输出从节点 1 开始的 BFS 遍历,在遍历过程中,如有多个可以选择 的节点,则优先选择编号较小的节点。
5、输出从节点 1 开始的 DFS 遍历,在遍历过程中,如有多个可以选择 的节点,则优先选择编号较小的节点。
6、输出从第 1 节点到第 n 节点最短路径的长度,如果没有路经,输出 0。
代码如下:
#include<iostream>
#include<cstdio>
#include<stdlib.h>
#include<string.h>
#include<queue>
using namespace std;
int n,m,a[11][11],dis[11],reached[11];
int bfs_reach[11],dfs_reach[11];
int dfsCount=0;
void bfs(int v){//广度优先搜索
int count=1;
queue<int> q;
bfs_reach[v]=1;
q.push(v);
cout<<1<<",";
while(!q.empty()){
int w=q.front();
q.pop();
for(int u=1;u<=n;u++)
if(a[w][u]!=0&&bfs_reach[u]==0){
q.push(u);
count++;
if(count==dfsCount)cout<<u<<endl;
else cout<<u<<",";
bfs_reach[u]=1;
}
}
/*for(int i=1,j=0;i<=n;i++)
if(bfs_reach[i]==1){
if(j==count){cout<<i<<endl;break;}
else cout<<i<<",";
j++;
}样例不符合,需要每次push一个元素同时输出*/
}
void dfs(int v){//深度优先搜索
dfs_reach[v]=1;
dfsCount++;
for(int u=1;u<=n;u++){
if(a[v][u]!=0&&dfs_reach[u]==0){
dfs(u);
}
}
return;
}
void shortestPath(){//单源最短路径
for(int i=2;i<=n;i++){
if(a[1][i]!=0)dis[i]=a[1][i];
else dis[i]=99999;
}
reached[1]=1;
for(int i=1;i<=n;i++){
int temp=99999,u=1;
for(int j=1;j<=n;j++){//在集合中寻找距离源点1最近的顶点u
if(reached[j]==0&&dis[j]<temp){
temp=dis[j];
u=j;
}
}
reached[u]=1;
for(int j=1;j<=n;j++)//更新集合a中与u邻接的顶点到源点1的距离
if(reached[j]==0&&a[u][j]!=0)
if(dis[j]>dis[u]+a[u][j])
dis[j]=dis[u]+a[u][j];
// cout<<"dis"<<dis[j]<<endl;
// cout<<u<<"->"<<j<<"="<<a[u][j]<<endl;
}
cout<<dis[n]<<endl;//输出到第n节点最短路径的长度
}
int main(){
cout<<"Input"<<endl;
char dou;
cin>>n>>dou>>m;//输入逗号作为分隔
int f,t,w;
for(int i=1;i<=m;i++){//存储结构使用邻接矩阵
cin>>f>>dou>>t>>dou>>w;
a[f][t]=a[t][f]=w;
}
cout<<"Output"<<endl;
dfs(1);
bfs(1);
for(int i=1,j=1;i<=n;i++){
if(dfs_reach[i]!=0){
if(j==dfsCount){cout<<i<<endl;break;}
else cout<<i<<",";
j++;
}
}
if(bfs_reach[n]==0)cout<<0<<endl;//如果不能到达第n节点,输出0
else shortestPath();
cout<<"End"<<endl;
return 0;
}
结论分析与体会:
通过本次实验学习了图的邻接矩阵存储结构,学习了在邻接矩阵下用dijkstra算法求单源最短路径的方法以及深度和广度优先搜索遍历图结构的方法。