数据结构
题目描述求图的DFS序列及BFS序列。图的顶点数<=20,边数<=100。
输入
图用邻接表存储。
图中的顶点用一个结构体数组存储,结构体定义如下:
typedef struct tnode
{ int vexdata;
struct node *firstarc;
}TD;
图中各顶点后接一个单链表,存储与顶点连接有边的邻接顶点信息,邻接顶点信息用结构体存储,定义如下:
typedef struct node
{ int adjvex;
struct node *next;
}JD;
程序运行时,先输入图的顶点个数及边的条数。注意,对于无向图而言,2顶点间的边算2条边。
然后输入顶点数据。
然后输入各条边信息,包括边的起点的值,终点的值(并不是点的序号)。
说明:为保证答案的唯一性,要求邻接表在建立各顶点后的单链表时,用头插法插入新来的结点。
输出
(这里是输出点的序号,序号是从1开始的)。
第一行输出DFS序列,序列中数字用逗号隔开。
第二行输出BFS序列,序列中数字用逗号隔开。
程序代码:[code]#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
queue<int> qe;
int bfs_sq[25],vex[25],in[25][25],vis[25],n,dfs_sq[25],l1,l2;
int search(int val)
{
for(int i = 0;i < n;i++)
if(vex[i] == val) return i; //ѰÕò¶Ôó|êy¾YμıàoÅ
}
void dfs(int x)
{
if(vis[x] ) return ;
else {
dfs_sq[l1++]=x;
vis[x]=1;
}
for(int i = in[x][0];i >= 0;i--){
if(!vis[ in[x][i] ] ) {
dfs(in[x][i]);
}
}
}
void bfs(int x)
{
if(vis[x] ) return ;
else {
bfs_sq[l2++]=x;
vis[x]=1;
}
for(int i = in[x][0];i >= 0;i--){
if(!vis[ in[x][i] ] ) {
qe.push(in[x][i]);
}
}
while(!qe.empty()) { //¶óáD BFS
x=qe.front(),qe.pop(),bfs(x);
}
}
int main()
{
int i,j,m,st,ed;
while(~scanf("%d,%d",&n,&m)){
memset(in,0,sizeof(in));
for(i = 0;i < n;i++) cin>>vex[i];
for(i = 0;i < m;i++) {
scanf("%d,%d",&st,&ed);
st=search(st),ed=search(ed);
j=1;
while(in[st][j]){ //0oÅλÖÃ′æáú½ó±ßμĸöêy
j++;
}
in[st][0]=j,in[st][j]=ed;
}
l1=l2=0; //3õê¼»ˉ
memset(vis,0,sizeof(vis)); //Çå3t±ê¼Ç
for(i = 0;i < n;i++){
if(!vis[i]) dfs(i);
}
memset(vis,0,sizeof(vis));
for(i = 0;i < n;i++){
if(!vis[i]) bfs(i);
}
for(i = 0;i < l1;i++){ //′e°¸êä3ö
if(i!=n-1)
printf("%d,",dfs_sq[i]+1);
else printf("%d\n",dfs_sq[i]+1);
}
for(i = 0;i < l2;i++){
if(i!=l2-1)
printf("%d,",bfs_sq[i]+1);
else printf("%d\n",bfs_sq[i]+1);
}
}
return 0;
}[/code]有没简单点的方法,求大神修改







