图的深度和广度优先遍历

2025-05-18 02:04:51
推荐回答(1个)
回答1:

#include
#define elemtype int
using namespace std;
const int n=8;//图中顶点数
const int e=15;// 图中的边数
const int max=1000;
int visited[n+1];//访问标志数组,为0表示未访问,为1表示已访问
int dist[n];//dist[i]存放从v到顶点i的最短路径
struct graph{//定义图的数据类型
elemtype v[n+1];//存放顶点信息v1,v2。。。vn,不使用v[0]存储空间
int arcs[n+1][n+1];//邻接矩阵
int w;//权值
};
int path[n];// path[i]存放在最短路径上从顶点i到前一点的顶点号
//该数组的作用是各点到指定始点的路径链成一条仿真链
int s[n];//s[i]=1表示顶点i的最短路径已经求出,s[i]=0表示未求出

void creat(){ //建立邻接矩阵
int i,j,k,w;
graph g;
cout<<"请输入"< for(k=1;k<=n;k++)
cin>>g.v[k];
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
g.arcs[i][j];
for(k=1;k<=e;k++){
cout<<"请输入第"< cin>>i>>j;
cout< g.arcs[i][j]=1;
g.arcs[j][i]=1;
}
}
void dfs(int i, graph g){//从顶点i出发进行深度优先搜索遍历
int j;

cout< visited[i]=1;
for(j=1;j<=n;j++)
if(g.arcs[i][j]==1&&!visited[j])
dfs(j,g);
}
void bfs(int i, graph g){//从顶点i出发进行广度优先搜索遍历
int q[n+1];//q为队列
int f,r,j;//f、r分别为队头、队尾指针
f=r=0;//初始化队列
cout< visited[i]=1;//标记已访问的顶点
r++;q[r]=i;//入队
while(f f++;i=q[f];//出队列
for(j=1;j<=n;j++)
if((g.arcs[i][j]==1&&!visited[j])){
cout< visited[j]=1;
r++;q[r]=j;//入队列
}

}
}
void shortestpath(const int v, graph g)
{ int i, j, k ,wm,max;
for(i=0;i {dist[i]= g.arcs[v][i];
if (i!=v && dist[i] s[i]=0;
};
s[v]=1; dist[v]=0; //将顶点v本身排除在外
for(k=0;k { wm=max; j=v;
for(i=0;i if (!s[i] && dist[i] < wm)
{j=i;wm= dist[i];}
s[j]=1;
for(i=0;i if (!s[i] && dist[j] + g.arcs[j][i]< dist[i])
{dist[i] = dist[j] +g.arcs[j][i];
path[i] = j;
}
}
}
int main(){
int i,j,v;
int yn=1;
graph g;
creat();
for(i=1;i<=n;i++){
for(j=1;j<=n;j++)
cout< cout< }
while(yn==1){
for(i=1;i<=n;i++)
visited[i]=0;
cout<<"请输入深度优先搜索开始访问的顶点:";
cin>>i;
cout< cout<<"从"< dfs(i,g);
cout< cin>>yn;
}
yn=1;
while(yn==1){
for(i=1;i<=n;i++)
visited[i]=0;
cout<<"请输入广度优先搜索开始访问的顶点:";
cin>>i;
cout< cout<<"从"< dfs(i,g);
cout< cin>>yn;
}
cout<<"请输入顶点v的值:";
cin>>v;
shortestpath(v,g);
cout< system("pause");
return 0;
}