图的应用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图的应用相关的知识,希望对你有一定的参考价值。
图采用邻接表存储,实现以下操作:
1、 从键盘输入数据,建立一个无向图;
2、 指定一个起始点,对该图进行深度优先遍历,并输出遍历结果;
3、 根据深度优先遍历结果,求得深度优先生成树,并输出该树的先序和中序遍历结果(不要求图形表示该树);
4、 判断从第u顶点至第v顶点是否有简单路径,若有则输出该路径上的顶点。
尽量用c语言来实现!
无向简单图怎么编程(奥赛题哟)
Lance博士一直致力于无向简单图性质的研究,他把他曾经研究过的图都用图的度序列纪录下来,无向简单图上的一个顶点所连的边的个数称为该顶点的度,所有顶点的度排列在一起构成图的度序列。例如图1的度序列就可以是:(2,1,1,3,1),度序列内部是没有顺序关系的,即图1的度序列同样可以表示成(1,2,3,1,1)。然后不久前,Lance博士的助手不小心将部分其他的数字序列混入到这些度序列纪录中,Lance博士无法分辨哪些是他原来的纪录,他于是聘请你帮他编写一个程序来辨别哪些数字序列是真正的度序列,即存在符合这个度序列的无向简单图。
输入文件:
如果该数字序列不是度序列,只需在第一行输出“No!”;
如果该数字序列是一个度序列,首先在第一行输出“Yes!”;然后在接下来的若干行里输出一个符合该度序列的图所有边,每行一条边。
我们默认一个图的顶点编号为1至T,如果顶点i与j之间有一条边,我们表示为“i j”。例如图一就可以表示为:
[IMG]http://sfgd.ik8.com/1.JPG.jpg[/IMG]
1 3
2 4
3 4
3 5
输入样例1:
5
3 2 1 1 1
输出样例1:
Yes!
1 3
2 4
3 4
3 5
输入样例2:
No!
说明:若连接结点之间的边可以不止一条,这样的图称为多重图。一个结点如果有指向自己的边,这条边被称为自环。无向简单图是指无自环的非多重图。
/*已调试成功前半部分(yes/no)*/
#include<stdio.h>
#define NMAX 100
int main( )
static a[NMAX][NMAX];
int top[NMAX];
int tops,i,temp,s=0,s1=0;
scanf("%d",&tops);
if(tops>NMAX)
fprintf(stderr,"too many vertax...\n");
return -1;
for(i=0;i<tops;++i)
scanf("%d",&temp);
s+=top[i]=temp;
if(temp%2)++s1;
if(s%2||s1%2)
printf("No!\n");
return 1;
printf("Yes!\n");
/* waiting...*/
return 0;
数据结构/无向图的创建及遍历的C语言描述(单链表方式)
http://hi.baidu.com/%CC%C6%B1%F3%CD%AC%D1%A7/blog/item/ce8648fc7434e5fefd037ff6.html 参考技术A 详细说下是什么意思
我来帮你 参考技术B 这明明是数据结构 放在数据库的分类里 服你了
化解数据结构----图的遍历和应用
一、图的遍历
定义:
从已给的连通图中某一顶点出发,沿着一些边访遍图中所有的顶点,且使每个顶点仅被访问一次,就叫做图的遍历,它是图的基本运算。
遍历实质: 找每个顶点的邻接点的过程。
图的特点:
图中可能存在回路
,且图的任一顶点都可能与其它顶点相通,在访问完某个顶点之后可能会沿着某些边又回到了曾经访问过的顶点。
怎样避免重复访问?
解决思路:设置辅助数组visited [n ],用来标记每个被访问过的顶点。
· 初始状态visited[i]为0
· 顶点i被访问
,改visited [0]为1
,防止被多次访问
1.深度优先遍历(DFS)
例如我们访问图的顶点的次数时,按照顺序如下:
同时,如果放到迷宫里,我们按照如下箭头顺序来进行访问:
我们来详细的进行分析:
以这个图为例↓↓↓
顶点访问次序:
V1→V2→V4→V8→V5→V3→V6→V7
V1→V2→V5→V8→V4→V3→V6→V7
V1→V2→V4→V8→V5→V3→V7→V6
V1→V2→V5→V8→V4→V3→V7→V6
V1→V3→V6→V7→V2→V4→V8→V5
即:连通图的深度优先遍历类似于树的先根遍历
2.深度优先遍历算法的实现
邻接矩阵表示的无向图深度遍历实现:
辅助数组在每次遍历之后,如果数的值为0则表示还未遍历,就会遍历这个数,并将其对应的数组中的值由0变为1
.
算法代码:
2.1 DFS算法效率分析
- 用
邻接矩阵
来表示图,遍历图中的每一个顶点都要从头扫描
到该顶点所在的行,时间复杂度为O(n^2)
- 用
邻接表
表示图,虽然有2e
个表结点,但只需要扫描e个结点即可完成遍历,加上访问n
个头结点的时间,时间复杂度为O(n+e)
。
结论:
稠密图适于在邻接矩阵上进行深度遍历
稀疏图适于在邻接表上进行深度遍历
2.2 非连通图的遍历
先遍历完一个图之后再遍历另一个图。
3.广度优先遍历(BFS)
方法:从图的某一结点出发,首先依次访问该结点的所有邻接点Vi, Vi2....,Vi,
再按这些顶点被访问的先后次序依次访问与它们相邻接的所有未被访问的顶点
重复此过程,直至所有顶点均被访问为止。
4.广度优先遍历算法的实现
4.1BFS算法效率问题
1.如果使用邻接矩阵
,则BFS对于每一个被访问到的顶点,都要循环检测矩阵中的整整一行(n个元素),总的时间代价为O(n^2)
。
2.用邻接表
来表示图,虽然有2e个表结点
,但只需扫描e个结点即可完成遍历,加上访问n个头结点的时间,时间复杂度为O(n+e)
。
5.DFS与BFS算法效率比较
·空间复杂度
相同,都是O(n)
(借用了堆栈或队列) ;
·时间复杂度
只与存储结构(邻接矩阵或邻接表)有关,而与搜索路径无关。O(n^2)和O(n+e)
二、图的应用
1.最小生成树
1.1生成树概念
生成树: 所有顶点均由边连接
在一起,但不存在回路
的图。
—个图可以有许多棵不同的生成树
图 2、3、4都是图1的生成树
但是:含有n个顶点的n-1条边的图却不一定是生成树。
1.2最小生成树
最小生成树: 给定一个(无向网络)
在该网的所有生成树中,使得各边权值之和最小
的那棵生成树称为该网的最小生成树
,也叫最小代价生成树。
1.3最小生成树的典型应用
1.4构造最小生成树
1.5 MST性质解释
在生成树的构造过程中,图中n个顶点分属两个集合:
已落在
生成树上的顶点集:u尚未落在
生成树上的顶点集: V-U
接下来则应在所有连通U
中顶点和V-U
中顶点的边中选取权值最小的边
。
1.6普里姆Prim算法
1.7 克鲁斯卡尔Kruskal算法
最小生成树不唯一
!
1.8 两种算法比较
2.最短路径
2.1典型用途
典型用途:
交通网络的问题——从甲地到乙地之间是否有公路连通?在有多条通路的情况下,哪一条路最短?
交通网络用有向网来表示:
- 顶点——表示地点
- 弧——表示两个地点有路连通
- 弧上的权值——表示两地点之间的距离、交通费或途中所花费的时间等
如何能够使一个地点到另一个地点的运输时间最短或运费最省?这就是一个求两个地点间的最短路径问题。
2.1两点间的最短路径
2.3某源点到其它各点的最短路径
2.4 Dijistra算法
初始化--选择--更新
每次以一个顶点为源点,重复执行Dijkstra算法n次。时间复杂度为O(n^3)
。
2.5弗洛伊德Floyd算法
算法思想:
- 逐个顶点试探
- 从v到v 的所有可能存在的路径中
- 选出一条长度最短的路径
3.拓扑排序
3.1有向无环图及其应用
AOV网:
用一个有向图表示一个工程的各子工程及其相互制约的关系,其中以顶点表示活动,弧表示活动之间的优先制约关系
,称这种有向图为顶点表示活动的网
,简称AOV网(Activity On Vertex network)。
AOE网:
用一个有向图表示一个工程的各子工程及其相互制约的关系,以弧表示活动,以顶点表示活动的开始或结束事件
,称这种有向图为边表示活动的网
,简称为AOE网(Activity On Edge)
3.2 拓扑排序定义
在AOV网没有回路的前提下,我们将全部活动排列成一个线性序列
,使得若AOV 网中有弧<i,j>
存在,则在这个序列中, i一定排在j的前面,具有这种性质的线性序列称为拓扑有序序列
,相应的拓扑有序排序的算法称为拓扑排序
。
3.3 拓扑排序的方法
- 在有向图中选一个
没有前驱
的顶点且输出之。 - 从图中删除该
顶点
和所有以它为尾的弧
。 - 重复上述两步,直至全部顶点均已输出;
或者当图中不存在无前驱的顶点
为止
………………………………………………………………………………………
一个AOV网的拓扑序列是不唯一的!
3.4拓扑排序重要应用
检测AOV网中是否存在环方法
:
对有向图构造其顶点的拓扑有序序列,若网中所有顶点都在它的拓扑有序序列
中,则该AOV 网必定不存在环。
4.关键路径
4.1定义
把工程计划表示为边表示活动的网络
,即AOE网
,用顶点表示事件
,弧表示活动
,弧的权表示活动持续时间。**事件**
表示在它之前的活动已经完成,在它之后的活动可以开始。
4.2举例
对于AOE网,我们关心两个问题:
(1)完成整项工程至少需要多少时闻?
(2)哪些活动是影响工程进度的关键?
关键路径——路径长度最长的路径。
路径长度——路径上各活动持续时间之和。
4.3关键时间
4.4举例说明
1.
2.
4.5求解关键路径步骤
4.6关键路径中的讨论
以上是关于图的应用的主要内容,如果未能解决你的问题,请参考以下文章