数据结构
题目描述求图的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]
有没简单点的方法,求大神修改