图的深度遍历

来源:互联网 发布:linux服务器ping不通 编辑:程序博客网 时间:2024/06/06 21:23

图的深度遍历

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的遍历结果。

示例输入

14 40 10 20 32 3

示例输出

0 1 2 3

提示

 

来源

 

示例程序

 

  • 提交 
  • 状态

 

#include <stdio.h>#include <stdlib.h>#define MAX 100typedef int Status;Status (*VisitFunc)(int v);typedef struct{    int arcs[MAX][MAX];    int vexnum,arcnum;}Graph;Status visited[MAX],count,begin;Status CreatUDG(Graph *G){    int i,j,k,v1,v2;    scanf("%d%d",&G->vexnum,&G->arcnum);    for(i=0;i<G->vexnum;i++)        for(j=0;j<G->vexnum;j++)        G->arcs[i][j]=0;    for(k=0;k<G->arcnum;k++)    {    scanf("%d%d",&v1,&v2);    G->arcs[v1][v2]=1;    G->arcs[v2][v1]=1;    }    return 1;}int visiT(int v){    if(count==0)        {        printf("%d",v);    count++;        }        else        printf(" %d",v);        return 1;}void DFS(Graph G,int v){    int w;    visited[v]=1;VisitFunc(v);    for(w=0;w<G.vexnum;w++)        if(!visited[w]&&G.arcs[v][w])        DFS(G,w);}void DFSTraverse(Graph G,Status(*Visit)(int v)){    int v;    VisitFunc=Visit;    for(v=0;v<G.vexnum;v++)visited[v]=0;    for(v=0;v<G.vexnum;v++)    if(!visited[v])DFS(G,v);}int main(){    int n;    Graph G;    scanf("%d",&n);    while(n--)    {        count=0;        CreatUDG(&G);        DFSTraverse(G,visiT);        printf("\n");    }    return 0;}


 

0 0
原创粉丝点击