1047图的深度优先遍历c语言
描述
图(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语言的更多相关文章
- C语言实现邻接矩阵创建无向图&图的深度优先遍历
/* '邻接矩阵' 实现无向图的创建.深度优先遍历*/ #include <stdio.h> #include <stdlib.h> #define MaxVex 100 // ...
- 图的深度优先遍历DFS
图的深度优先遍历是树的前序遍历的应用,其实就是一个递归的过程,我们人为的规定一种条件,或者说一种继续遍历下去的判断条件,只要满足我们定义的这种条件,我们就遍历下去,当然,走过的节点必须记录下来,当条件 ...
- 图的深度优先遍历(DFS) c++ 非递归实现
深搜算法对于程序员来讲是必会的基础,不仅要会,更要熟练.ACM竞赛中,深搜也牢牢占据着很重要的一部分.本文用显式栈(非递归)实现了图的深度优先遍历,希望大家可以相互学习. 栈实现的基本思路是将一个节点 ...
- PTA 邻接矩阵存储图的深度优先遍历
6-1 邻接矩阵存储图的深度优先遍历(20 分) 试实现邻接矩阵存储图的深度优先遍历. 函数接口定义: void DFS( MGraph Graph, Vertex V, void (*Visit)( ...
- 图的深度优先遍历(DFS)—递归算法
实验环境:win10, DEV C++5.11 实验要求: 实现图的深度优先遍历 实验代码: #include <iostream> #define maxSize 255 #includ ...
- java实现图的深度优先遍历和广度优先遍
首先需要知道的是,图的深度优先遍历是一种类似于树的前序遍历方式,即选择一个入口节点,沿着这个节点一直遍历下去,直至所有节点都被访问完毕:如果说,图的深度优先遍历类似于树的前序遍历的话,那么图的广度优先 ...
- 图论 - 图的深度优先遍历c++实现
图的深度优先遍历c++实现 深度优先搜索 邻接矩阵的创建 int i, j, m, a, b; cin >> n >> m; //初始化二维矩阵 for (i = 1; i & ...
- 数据结构——图的深度优先遍历(邻接矩阵表示+java版本)
1.深度优先遍历(DFS) 图的深度优先遍历本质上是一棵树的前序遍历(即先遍历自身,然后遍历其左子树,再遍历右子树),总之图的深度优先遍历是一个递归的过程. 如下图所示,左图是一个图,右图是图的深度 ...
- 图的广度、深度优先遍历 C语言
以下是老师作为数据结构课的作业的要求,没有什么实际用处和可以探讨和总结的的地方,所以简单代码直接展示. 宽度优先遍历: #include<cstdio> #include<iostr ...
随机推荐
- hdu 1596 find the safest road(最短路,模版题)
题目 这是用Dijsktra做的,稍加改动就好,1000ms..好水.. #define _CRT_SECURE_NO_WARNINGS #include<string.h> #inclu ...
- POJ 1486 Sorting Slides(寻找必须边)
题意:找出幻灯片与编号唯一对应的情况 思路: 1:求最大匹配,若小于n,则答案为none,否则转2 (不过我代码没有事先判断一开始的最大匹配数是否<n,但这样也过了,估计给的数据最大匹配数一定为 ...
- C# Log4Net配置
Log4Net是用来记录日志的,可以将程序运行过程中的信息输出到一些地方(文件.数据库.EventLog等),日志就是程序的黑匣子,可以通过日志查看系统的运行过程,从而发现系统的问题.日志的作用:将运 ...
- JsRender系列demo(7)compline
<!DOCTYPE html> <html> <head> <script src="http://code.jquery.com/jquery.j ...
- React-Native学习指南
React-Native学习指南 本指南汇集React-Native各类学习资源,给大家提供便利.指南正在不断的更新,大家有好的资源欢迎Pull Requests! 同时还有Awesome React ...
- POJ3253Babelfish
http://poj.org/problem?id=3253 就是一个哈夫曼树,题目下边有提示,所以题意还是好理解的 #include<cstdio> #include<cstrin ...
- SqlDBHelper常用方法
/*============================================================= *.net连接数据库常用方法 *Author : dongny,Li * ...
- 如何在Android应用程序中使用传感器模拟器SensorSimulator
原文地址; 如何在Android应用程序中使用传感器模拟器 - 移动平台应用软件开发技术 - 博客频道 - CSDN.NET http://blog.csdn.net/pku_android/arti ...
- rhel-server-7.2-x86_64无法联网(VMware环境)
vim /etc/sysconfig/network-script vim ifcfg-eno16777736 (编辑网卡名) 将ONBOOT=NO更改为YES (启动network服务时是否启用该网 ...
- [转]useradd 与adduser的区别
转自:Deit_Aaron的专栏 添加用户:useradd -m 用户名 然后设置密码 passwd 用户名 删除用户:userdel -r 用户名 1. 在root权限下,useradd只是 ...