//图的建立的实现->邻结矩阵和邻结表两种表示方法
#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. mysql一对多关联查询的时候筛选条件

    mysql实现users 表和 logoin_log表是一对多, 现在是把user的信息找出来 关联上一些 logoin_log表的数据, 因为a表是多的一方,要多他的数据进行一些条件匹配,这个sql ...

  2. a标签替代input的submit提交功能

    在工作中有时候会遇到A标签,但是提交表单的时候我们需要用到submit来提交表单,下面几行代码很好的解决了这个问题! <div class="btn"><a hr ...

  3. Spring IoC容器的设计——BeanFactory应用场景2

    1.BeanFactory接口设计了getBean方法,这个方法是使用IoC容器API的主要方法,通过这个方法,可以取得IoC容器中管理的Bean,Bean的取得是通过指定名字来索引的. 2.如果需要 ...

  4. Codevs 2898 卢斯的进位制

    时间限制: 1 s  空间限制: 32000 KB  题目等级 : 青铜 Bronze 题目描述 Description 著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母 ...

  5. 记录一次会话CRT

    记录一次会话CRT --------------------- su -oracle sqlplus / as sysdba sqlplus username/password  如:普通用户登录   ...

  6. 使用Hint来优化执行计划

    最近看主管优化了一个HINT相关的查询 借此机会学习下HINT 参考Notes: Note 129385 - Database hints in Open SQL http://www.stechno ...

  7. 《samba服务配置的文本》

    创建简单的samba服务器 samba  很少用于互联网 /大部分用于局域网  网页更新/ 首先看下你是否安装后了samba. rpm -qa | grep samba samba的简介 1)samb ...

  8. 推荐一些C#相关的网站、资源和书籍

    一.网站 1.http://msdn.microsoft.com/zh-CN/ 微软的官方网站,C#程序员必去的地方.那里有API开发文档,还有各种代码.资源下载. 2.http://social.m ...

  9. DTCMS列表页自定义参数。

    1.频道管理中,URL配置,增加一个参数person_id 2.在photo_list.html模板页中,添加以下代码 <!--C#代码--> <%csharp%> strin ...

  10. Sql 临时表

    一个#是只能在当前打开滴查询窗体查询,两个#是能够在其他打开滴查询窗体查询 SELECT 'VR001839003YP' 列名1,'RO512498726DE' 列名2 INTO #临时表 UNION ...