领接表的建立和它的DFS, BFS;;;
//图的建立的实现->邻结矩阵和邻结表两种表示方法
#include <cstdio>
#include <cstdlib>
//#define _OJ_ int visit[100];
typedef struct Lnode
{
int data; //邻结点的位置下标
// int weight;
struct Lnode *next; //表由多排的链表组成 } Lnode, *Linklist; typedef struct Fnode
{
int elem; //每个顶点的信息 是数字或是字符
Linklist firstcell; //构成多个头节点
} Fnode1[100]; typedef struct Graph1
{
int nv;
int ne;
Fnode1 G; //图由顶点数,边数,和邻接表组成
} Graph1, *Graph; typedef struct Edge1
{
int v1;
int v2;
// int weight; //边由两个顶点的值构成
} Edge1, *Edge; Graph
creat_graph(int vertex, int edge)
//分配边数和节点数并初始化
{
int i;
Graph g;
g = (Graph) malloc (sizeof(Graph1));
g->nv = vertex;
g->ne = edge; for(i = 0;i < vertex; i++) {
g->G[i].firstcell = NULL; //把每一个头接点赋初值
g->G[i].elem = i; //输入每个节点的信息
} return g;
} void
inser_edge(Graph g, Edge e)
{
Linklist L, L1;
L = (Linklist) malloc (sizeof(Lnode));
L->data = e->v2;
L->next = g->G[e->v1].firstcell;
g->G[e->v1].firstcell = L;
//无向图的插入两边 每次增加一个节点将其插入在最前面
L1 = (Linklist) malloc (sizeof(Lnode));
L1->data = e->v1;
L1->next = g->G[e->v2].firstcell;
g->G[e->v2].firstcell = L1;
} Graph
build_Graph(void)
{
Graph g;
Edge e;
int i, j, vertex, edge;
scanf("%d %d", &vertex, &edge);
g = creat_graph(vertex, edge); if(edge > 0) {
e = (Edge) malloc (sizeof(Edge1));
for(i = 0;i < edge; i++) {
scanf("%d %d", &e->v1, &e->v2);
inser_edge(g, e);
} return g;
}
} void
DFS(Graph g, int v)
{
int i;
visit[v] = 1;
printf("%d ", g->G[v].elem); while (g->G[v].firstcell->next != NULL) {
if(visit[g->G[v].firstcell->data] == 0)
DFS(g, g->G[v].firstcell->data);
g->G[v].firstcell = g->G[v].firstcell->next;
} } void
DFS_travers(Graph g)
{
int i;
for(i = 0;i < g->nv; i++)
visit[i] = 0; for(i = 0;i < g->nv; i++)
if(visit[i] == 0) DFS(g, i);
} typedef struct Queue1
{
int top;
int base;
int *data1;
} Queue1, *Queue; Queue
creat_queue(void)
{
Queue q;
q = (Queue) malloc (sizeof(Queue1));
q->data1 = (int*) malloc (100 * sizeof(int));
q->base = q->top = 0;
return q;
} int
isempty(Queue q)
{
if(q->base == q->top)
return 1;
else
return 0;
} void
Enqueue(Queue q, int data)
{
q->data1[q->top++] = data;
} int
Dequeue(Queue q)
{
return q->data1[q->base++];
} void
BFS(Graph g, int v)
{ int i;
Queue q;
Linklist L;
q = creat_queue();
printf("%d ", g->G[v].elem);
visit[v] = 1;
Enqueue(q, v); while (isempty(q) != 1) {
i = Dequeue(q);
L = g->G[i].firstcell;
while (L) {
if(visit[L->data] == 0) {
printf("%d ", g->G[L->data].elem);
visit[L->data] = 1;
Enqueue(q, L->data);
}
L = L->next;
}
} } void
BFS_travers(Graph g)
{
int i;
for(i = 0;i < g->nv; i++)
visit[i] = 0;
for(i = 0;i < g->nv; i++) {
if(visit[i] == 0)
BFS(g, i);
}
} int main(int argc, char const *argv[]) {
#ifndef _OJ_ //ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif int i, j;
Graph g;
g = build_Graph();
// for(i = 0;i < g->nv; i++) {
// //printf("%p\n", g->G[i].firstcell); //循环重复的遍历每一条链表
// printf("%d -> ", i);
// while (g->G[i].firstcell != NULL) {
// printf("%d ",g->G[i].firstcell->data);
// g->G[i].firstcell = g->G[i].firstcell->next;
// }
// printf("\n");
// }
DFS_travers(g);
// BFS_travers(g); return 0;
}
/*
8 9
0 1
0 2
1 3
1 4
2 5
2 6
3 7
4 7
5 6
vertex:A→:2→:1
vertex:B→:4→:3→:0
vertex:C→:6→:5→:0
vertex:D→:7→:1
vertex:E→:7→:1
vertex:F→:6→:2
vertex:G→:5→:2
vertex:H→:4→:3
建立无误
BFS: 0 2 1 6 5 4 3 7
DFS: 0 2 6 5 1 4 7 3
*/
领接表的建立和它的DFS, BFS;;;的更多相关文章
- hive外部表的建立与数据匹配
1.建立hive的外部表匹配hdfs上的数据 出现如下报错: hive (solar)> ; OK Failed with exception java.io.IOException:java. ...
- SPFA中 正逆邻接表的建立
正邻接表的建立: 先定义一个结构体: struct node { int r,v,w,next; }Map[]; 每输入一组数据 就通过Add函数加入到邻接表中,上图已经说得很明白了,结合着下面的代码 ...
- POJ 3275 Ranking the Cows(传递闭包)【bitset优化Floyd】+【领接表优化Floyd】
<题目链接> 题目大意:FJ想按照奶牛产奶的能力给她们排序.现在已知有N头奶牛$(1 ≤ N ≤ 1,000)$.FJ通过比较,已经知道了M$1 ≤ M ≤ 10,000$对相对关系.每一 ...
- Hive表的建立和导入导出数据
Hive是Hadoop的常用工具之一,Hive查询语言(HiveQL)的语法和SQL类似,基本实现了SQL-92标准. 1. 表的建立 编写以下的文件: USE test; DROP TABLE IF ...
- Django数据库的查看、删除,创建多张表并建立表之间关系
配置以下两处,可以方便我们直接右键运行tests.py一个文件,实现对数据库操作语句的调试: settings里面的设置: #可以将Django对数据库的操作语法,能输出对应的的sql语句 LOGGI ...
- oracle11gR2下scott用户以及表的建立
目录 oracle11gR2下scott用户以及表的建立 找到系统带的sql文件(utlsample.sql) 根据SQL的内容操作 新建用户并授权 scott登录 表操作 查询表(使用pl/sql) ...
- GG_Model 类库与数据库表对应建立实体类
3.4.GG_Model 类库与数据库表对应建立实体类 我这里不教大家写代码,直接用TT模板自动生成,省去写代码的麻烦. A. 三个文件MysqlDbhelper.ttinclude .mysqlMa ...
- [MySQL数据库之表的约束条件:primary key、auto_increment、not null与default、unique、foreign key:表与表之间建立关联]
[MySQL数据库之表的约束条件:primary key.auto_increment.not null与default.unique.foreign key:表与表之间建立关联] 表的约束条件 约束 ...
- 关于《hibernate多对多》有中间表的建立
角色 与 菜单(资源)的多对多关系,在这里我们建立中间表,用两个oneToMany实现 实体类: 角色(GmRole) 菜单(GmMenu) 中间表(GmRoleRight) 1.在角色实体中 pa ...
随机推荐
- 关于SVN下载代码和Android Studio里面导入别人代码build tools不一致问题总结
项目build tools的sdk我没有 网络问题没法下载. 解决问题 方法 1.下载对应的SDK.需要VPN,或者FQ 2.将bulid.gradle的内容用下面的内容替换 // Top-level ...
- Struts2_概述
- 安装包安装服务,点修复出现的错误”Error 1001:指定的服务已存在“ 解决办法
安装项目下,右键视图->自定义操作,出现安装.提交.回滚.卸载四个文件夹,右键安装,添加自定义操作,选择安装的服务为输出文件 右键安装输出文件->在condition->Not (I ...
- python:浅析python 中__name__ = '__main__' 的作用
有句话经典的概括了这段代码的意义: “Make a script both importable and executable” 意思就是说让你写的脚本模块既可以导入到别的模块中用,另外该模块自己也可 ...
- android ListView_Tiger
xml设计 <?xml version="1.0"?> -<LinearLayout tools:context=".MainActivity" ...
- Java--CJDP
was定义,包定义, 1. Java的接口概念 进行封装,方便的使用 2. 包定义,Java 中多种包,进行迁移使用,包的导入,例如对数据库的操作Hibernate 3. 配置文件xml和json,对 ...
- .NET中的 枚举
我理解的枚举就是编程中约定的一个"可选值":例如QQ的在线状态,分别有 在线,Q我吧,隐身,忙碌等等...我觉得这就是一个枚举. 1.普通枚举 1) 实例 public en ...
- 《NFS文件共享服务的搭建》RHEL
首先要清楚一点:NFS服务的共享是建立在linux和linux之间的. 配置任何服务之前我们要做的2件事: iptables -F setenforce 0 NFS服务内核防火墙影响不大,主要 ...
- 用 Function.apply() 的参数数组化来提高 JavaScript程序性能
我们再来聊聊Function.apply() 在提升程序性能方面的技巧. 我们先从 Math.max() 函数说起, Math.max后面可以接任意个参数,最后返回所有参数中的最大值. 比如 aler ...
- rinetd 安装使用
1 下载解压: wget http://www.boutell.com/rinetd/http/rinetd.tar.gz tar zxvf rinetd.tar.gz 2 手动建立目录 mkdir ...