图的深度遍历
2014-02-19 14:57
274 查看
图的深度遍历
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
提示
#include<stdio.h> #include<string.h> #include<malloc.h> struct node { int date; struct node *next; }; int sz[109]; struct node a[109]; void dfs(int i) { int j; if(i == 0) printf("%d",i); else printf(" %d",i); sz[i] = 1; struct node *p; for(p = &a[i];p!=NULL;p = p->next) { j = p->date; if(!sz[j]) dfs(j); } } int main() { int n; scanf("%d",&n); while(n--) { int k,m,i; memset(sz,0,sizeof(sz)); scanf("%d%d",&k,&m); for(i = 0; i<k; i++) { a[i].date=i; a[i].next=NULL; } while(m--) { int x,y; scanf("%d%d",&x,&y); struct node *p,*q; p = new node; q = &a[x]; p->date = y; p->next = NULL; if(q->next == NULL) { q->next = p; } else { while(q->next->date < p->date) { q = q->next; if(q->next == NULL) break; } p->next = q->next; q->next = p; } } for(i = 0; i<k; i++) { if(sz[i] == 0) dfs(i); } printf("\n"); } return 0; }
相关文章推荐
- 最大化,最小化的区别
- wait morphing
- 优先级队列--坦克大战
- 京东的未来靠什么?
- 美国创建3D打印自动化生产线 可造卫星无人机
- eclipse中恢复窗口布局
- 如何打好网球
- python的pip和virtualenv使用心得
- PB源码如何配置连接数据库
- HTML5画布颜色教程
- Windows Server 2003域升级到Windows Server 2012 R2域
- 合数乘积
- My .profile
- 《javascript权威指南》读书笔记 -part2
- 美国男孩手掌天生残疾 借3D打印技术获新手(图)
- IOS Button简要说明
- CGLib动态代理技术织入
- [笔记] Android Service 使用注意事项
- android Handler 机制研究学习笔记
- C++中那些令人蛋疼的带const形参的重载函数