//图的建立的实现->邻结矩阵和邻结表两种表示方法
#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;;;的更多相关文章

  1. hive外部表的建立与数据匹配

    1.建立hive的外部表匹配hdfs上的数据 出现如下报错: hive (solar)> ; OK Failed with exception java.io.IOException:java. ...

  2. SPFA中 正逆邻接表的建立

    正邻接表的建立: 先定义一个结构体: struct node { int r,v,w,next; }Map[]; 每输入一组数据 就通过Add函数加入到邻接表中,上图已经说得很明白了,结合着下面的代码 ...

  3. POJ 3275 Ranking the Cows(传递闭包)【bitset优化Floyd】+【领接表优化Floyd】

    <题目链接> 题目大意:FJ想按照奶牛产奶的能力给她们排序.现在已知有N头奶牛$(1 ≤ N ≤ 1,000)$.FJ通过比较,已经知道了M$1 ≤ M ≤ 10,000$对相对关系.每一 ...

  4. Hive表的建立和导入导出数据

    Hive是Hadoop的常用工具之一,Hive查询语言(HiveQL)的语法和SQL类似,基本实现了SQL-92标准. 1. 表的建立 编写以下的文件: USE test; DROP TABLE IF ...

  5. Django数据库的查看、删除,创建多张表并建立表之间关系

    配置以下两处,可以方便我们直接右键运行tests.py一个文件,实现对数据库操作语句的调试: settings里面的设置: #可以将Django对数据库的操作语法,能输出对应的的sql语句 LOGGI ...

  6. oracle11gR2下scott用户以及表的建立

    目录 oracle11gR2下scott用户以及表的建立 找到系统带的sql文件(utlsample.sql) 根据SQL的内容操作 新建用户并授权 scott登录 表操作 查询表(使用pl/sql) ...

  7. GG_Model 类库与数据库表对应建立实体类

    3.4.GG_Model 类库与数据库表对应建立实体类 我这里不教大家写代码,直接用TT模板自动生成,省去写代码的麻烦. A. 三个文件MysqlDbhelper.ttinclude .mysqlMa ...

  8. [MySQL数据库之表的约束条件:primary key、auto_increment、not null与default、unique、foreign key:表与表之间建立关联]

    [MySQL数据库之表的约束条件:primary key.auto_increment.not null与default.unique.foreign key:表与表之间建立关联] 表的约束条件 约束 ...

  9. 关于《hibernate多对多》有中间表的建立

    角色 与 菜单(资源)的多对多关系,在这里我们建立中间表,用两个oneToMany实现 实体类: 角色(GmRole)  菜单(GmMenu) 中间表(GmRoleRight) 1.在角色实体中 pa ...

随机推荐

  1. DWZ与KindEditor编辑器的整合

    DWZ自带的编辑器是xheditor,可能很多人用不习惯.就像我,习惯用kindeditor了.现在就来说说如何整合dwz和kindeditor. 一.打开DWZ的中的dwz.ui.js,进行修改. ...

  2. MySQL之控制台修改密码

    进入控制台:use mysql Database changed update user set password=PASSWORD('设置的密码') where user='root'; flush ...

  3. php 检查email电子邮件函数(奇葩写法)

    以前写的一个PHP表单电子邮件发送程序,其中采用如下方法来验证电子邮件地址格式是否正确: 代码如下 复制代码 eregi("^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0 ...

  4. Java关键字介绍之this与super

    1.什么是super?什么是this? super关键字表示超(父)类的意思.this变量代表对象本身. 2.使用super&this调用成员变量和方法 可以使用super访问父类被子类隐藏的 ...

  5. H5笔记——locaStorage和sessionStorage本地存储的一些坑

    当使用window.localStorage或者window.sessionStorage 存储json数据时需要将json数据用JSON.stringify(data)转换成json字符串再存储在本 ...

  6. 单机版简单弹幕墙demo (jqery+bootstrap)

    最近在看fcc  ,上面有一个弹幕墙设计的题目,要求从后端获取数据,显示出来.百度,谷歌都没找到相关好的例子作为借鉴,索性按照自己的思路写了一个简单的demo  .在做demo的过程中遇到最大的问题就 ...

  7. [Silverlight] Visual Studio2010不能安装Silverlight4_Tools,提示语言不一致

    今天在装Silverlight4_Tools时出现“必须先安装与 Silverlight Tools 4 语言版本相一致的 Visual Studio 2010.Visual Web Develope ...

  8. C++ Double Ended Queues(双向队列)

    双向队列和向量很相似,但是它允许在容器头部快速插入和删除(就像在尾部一样). Constructors 创建一个新双向队列 Operators 比较和赋值双向队列 assign() 设置双向队列的值 ...

  9. C语言 数组输出,冒泡排序法,沉底排序法,二维数组输出,输出字母列长度,从随机数组中找重复数

    #include <stdio.h> #define sum 3+4//宏定义是原封不动的使用used for test4 #include <time.h>//used fo ...

  10. 使用C++读取UTF8及GBK系列的文本方法及原理

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4374404.html 1.读取UTF-8编码文本原理 首先了解UTF-8的编码方式,UTF- ...