基于邻接表的深度优先搜索遍历
基于邻接表的深度优先搜索遍历
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
请定一个无向图,顶点编号从0到n-1,用深度优先搜索(DFS),遍历并输出。遍历时,先遍历节点编号小的。
输入
输入第一行为整数n(0 < n < 100),表示数据的组数。 对于每组数据,第一行是两个整数k,m(0 < k < 100,0 < m < k*k),表示有m条边,k个顶点。 下面的m行,每行是空格隔开的两个整数u,v,表示一条连接u,v顶点的无向边。
输出
输出有n行,对应n组输出,每行为用空格隔开的k个整数,对应一组数据,表示DFS的遍历结果。
示例输入
1 4 4 0 1 0 2 0 3 2 3
示例输出
0 1 2 3
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<cstdlib> 5 #include<queue> 6 using namespace std; 7 struct vode 8 { 9 int v; 10 struct vode *next; 11 }; 12 struct vode *f[1000001]; 13 int m,n,k,flag,visited[101]; 14 void add(int u,int v) 15 { 16 struct vode *p; 17 p=(struct vode *)malloc(sizeof(struct vode)); 18 p->v=v; 19 p->next=f[u]; 20 f[u]=p; 21 } 22 void paixu(struct vode *head) 23 { 24 struct vode *p,*q; 25 int k=0; 26 while(k=!k) 27 { 28 p=head; 29 q=p->next; 30 while(q) 31 { 32 if(p->v>q->v) 33 { 34 int t; 35 t=p->v; 36 p->v=q->v; 37 q->v=t; 38 k=0; 39 } 40 else 41 { 42 p=p->next; 43 q=p->next; 44 } 45 } 46 } 47 } 48 void dfs(int k) 49 { 50 if(flag==0) 51 { 52 cout<<k; 53 flag=1; 54 } 55 else 56 cout<<" "<<k; 57 visited[k]=1; 58 struct vode *p; 59 p=f[k]; 60 paixu(p); 61 while(p) 62 { 63 if(visited[p->v]==0) 64 dfs(p->v); 65 p=p->next; 66 } 67 } 68 int main() 69 { 70 int zong; 71 cin>>zong; 72 while(zong--) 73 { 74 flag=0; 75 memset(f,0,sizeof(f));//词句不可缺少 76 memset(visited,0,sizeof(visited)); 77 cin>>m>>n; 78 int i; 79 for(i=1;i<=n;i++) 80 { 81 int u,v; 82 cin>>u>>v; 83 add(u,v); 84 add(v,u); 85 } 86 dfs(0); 87 cout<<endl; 88 } 89 return 0; 90 }