描述

图(graph)是数据结构 G=(V,E),其中V是G中结点的有限非空集合,结点的偶对称为边(edge);E是G中边的有限集合。设V={0,1,2,……,n-1},图中的结点又称为顶点(vertex),有向图(directed graph)指图中代表边的偶对是有序的,用<u,v>代表一条有向边(又称为弧),则u称为该边的始点(尾),v称为边的终点(头)。无向图(undirected graph)指图中代表边的偶对是无序的,在无向图中边(u,v )和(v,u)是同一条边。

输入边构成无向图,求以顶点0为起点的深度优先遍历序列。

输入

第一行为两个整数n、e,表示图顶点数和边数。以下e行每行两个整数,表示一条边的起点、终点,保证不重复、不失败。1≤n≤20,0≤e≤190

输出

前面n行输出无向图的邻接矩阵,最后一行输出以顶点0为起点的深度优先遍历序列,对于任一起点,首先遍历的是终点序号最小的、尚未被访问的一条边。每个序号后输出一个空格。

样例输入

4 5
0 1
0 3
1 2
1 3
2 3

样例输出

0 1 0 1 
1 0 1 1 
0 1 0 1 
1 1 1 0 
0 1 2 3

代码:

#include<stdio.h>
#include<malloc.h> typedef struct graph //图的结构体
{
int Vertices; //顶点数
int **A; //图的二维矩阵
}Graph; void CreateGraph(Graph *g,int n) //创建一个、包含了n个顶点的图
{
int i,j;
g->Vertices = n;
g->A = (int**)malloc(n*sizeof(int*));
for(i = ;i < n;i++)
{
g->A[i] = (int*)malloc(n*sizeof(int));
for(j = ;j < n;j++)
g->A[i][j] = ;
}
} int Add(Graph *g,int u,int v) //在图g中添加一条边(u,v)
{
int n = g->Vertices;
if(u<||v<||u>n-||v>n-||g->A[u][v]!=) //不知道为什么这里不要判断u==v的情况
{
return ;
}
g->A[u][v]=;
return ;
} int Exist(Graph g,int u,int v) //判断图中是否存在边(u,v)
{
int n;
n = g.Vertices;
if(u<||v<||u>n-||v>n-||g.A[u][v]==)
return ;
return ;
} void DFS(Graph g,int v,int *visited) //深度遍历图
{
int w;
visited[v]=;
printf("%d ",v);
for(w=;w<g.Vertices;w++)
{
if(Exist(g,v,w)&&visited[w]!=)
DFS(g,w,visited);
}
} int main()
{
int enumber,vnumber,one,two,i,j;
Graph g;
int visited[]; scanf("%d %d",&vnumber,&enumber); //vnumber为图中顶点的个数,enumber为图中边的条数
if(<=vnumber<=&&<=enumber<=)
{
CreateGraph(&g,vnumber); //创建一个图
}
else
return ; for(i=;i<enumber;i++) //向图中添加边
{
scanf("%d %d",&one,&two);
Add(&g,one,two);
Add(&g,two,one);
} for(i=;i<vnumber;i++) //将图的邻接矩阵输出
{
for(j=;j<vnumber;j++)
{
if(Exist(g,i,j))
printf("%d ",);
else
printf("%d ",);
}
printf("\n");
} for(i=;i<g.Vertices;i++) //visited[]为每个顶点的标志位,用来判断顶点是否被访问过,0表示没有被访问。
{
visited[i]=;
}
for(i=;i<g.Vertices;i++)
{
if(visited[i]!=) //深度遍历图
DFS(g,i,visited);
}
printf("\n");
return ;
}

1047图的深度优先遍历c语言的更多相关文章

  1. C语言实现邻接矩阵创建无向图&图的深度优先遍历

    /* '邻接矩阵' 实现无向图的创建.深度优先遍历*/ #include <stdio.h> #include <stdlib.h> #define MaxVex 100 // ...

  2. 图的深度优先遍历DFS

    图的深度优先遍历是树的前序遍历的应用,其实就是一个递归的过程,我们人为的规定一种条件,或者说一种继续遍历下去的判断条件,只要满足我们定义的这种条件,我们就遍历下去,当然,走过的节点必须记录下来,当条件 ...

  3. 图的深度优先遍历(DFS) c++ 非递归实现

    深搜算法对于程序员来讲是必会的基础,不仅要会,更要熟练.ACM竞赛中,深搜也牢牢占据着很重要的一部分.本文用显式栈(非递归)实现了图的深度优先遍历,希望大家可以相互学习. 栈实现的基本思路是将一个节点 ...

  4. PTA 邻接矩阵存储图的深度优先遍历

    6-1 邻接矩阵存储图的深度优先遍历(20 分) 试实现邻接矩阵存储图的深度优先遍历. 函数接口定义: void DFS( MGraph Graph, Vertex V, void (*Visit)( ...

  5. 图的深度优先遍历(DFS)—递归算法

    实验环境:win10, DEV C++5.11 实验要求: 实现图的深度优先遍历 实验代码: #include <iostream> #define maxSize 255 #includ ...

  6. java实现图的深度优先遍历和广度优先遍

    首先需要知道的是,图的深度优先遍历是一种类似于树的前序遍历方式,即选择一个入口节点,沿着这个节点一直遍历下去,直至所有节点都被访问完毕:如果说,图的深度优先遍历类似于树的前序遍历的话,那么图的广度优先 ...

  7. 图论 - 图的深度优先遍历c++实现

    图的深度优先遍历c++实现 深度优先搜索 邻接矩阵的创建 int i, j, m, a, b; cin >> n >> m; //初始化二维矩阵 for (i = 1; i & ...

  8. 数据结构——图的深度优先遍历(邻接矩阵表示+java版本)

    ​1.深度优先遍历(DFS) 图的深度优先遍历本质上是一棵树的前序遍历(即先遍历自身,然后遍历其左子树,再遍历右子树),总之图的深度优先遍历是一个递归的过程. 如下图所示,左图是一个图,右图是图的深度 ...

  9. 图的广度、深度优先遍历 C语言

    以下是老师作为数据结构课的作业的要求,没有什么实际用处和可以探讨和总结的的地方,所以简单代码直接展示. 宽度优先遍历: #include<cstdio> #include<iostr ...

随机推荐

  1. POJ2752 Seek the Name,Seek the Fame KMP算法

    KMP继续练手.题目问的是一个串前缀等于后缀的可能长度是哪些,输出来.题目考的是对KMP失配指针的理解,当最后一位失配(即'\0'那里)时,指针会移动到前缀对应匹配的部分,所以这个长度是我们要的,然后 ...

  2. 学习笔记--Grunt、安装、图文详解

    学习笔记--Git安装.图文详解 安装Git成功后,现在安装Gruntjs,官网:http://gruntjs.com/ 一.安装node 参考node.js 安装.图文详解 (最新的node会自动安 ...

  3. Java Excel

    http://www.cnblogs.com/mingforyou/archive/2013/08/26/3282922.html

  4. linux的strace命令用法

    strace命令用法 调用:strace [ -dffhiqrtttTvxx ] [ -acolumn ] [ -eexpr ] …[ -ofile ] [ -ppid ] … [ -sstrsize ...

  5. TDD 用语

    OOP  封装  继承  多态 SOLID  SRP 单一职责  Single Responsibility Principle  OCP 开放封闭  Open/Close Principle  LS ...

  6. Hibernate逍遥游记-第8章 映射组成关系(<component>、<parent>)

    一. 1. <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate ...

  7. YASKAWA电机控制(2)---调试

    2015 5 23 基础调试—点动 上次接线由于没有接地,导致外壳带电,非常危险. 由于上次接线端子被弄坏,这次自己重做.由于没有压线钳,只用尖嘴钳把线压近端子,有可能会松动. 接线的时候Lc1.Lc ...

  8. libsvm+detector_(libsvm参数说明)

    细分析了cvhop.cpp中的compute函数,可以直接调用它来获得样本HOG,然后训练得到检测算子 1.制作样本2.对每一张图片调用hog.compute(img, descriptors,Siz ...

  9. makefile生成静态库和动态库

    库是一种软件组件技术,库里面封装了数据和函数. 库的使用可以使程序模块化. Windows系统包括静态链接库(.lib文件)和动态链接库(.dll文件). Linux通常把库文件存放在/usr/lib ...

  10. 特殊的css样式

    在一定范围大小变化的div .div { width:auto; height:auto; min-height:100px; min-width:100px; max-height:200px; m ...