数据结构之图的最短路径

最短路径程序实现:

#include<stdio.h>

#include<stdlib.h>

#define VEXNUM 6//顶点数

#define ARCNUM 10//边数

#define INT_MAX 10000//先定义最大权值;

struct Graph{

int vexs[VEXNUM+1];//顶点数组;

    int a[VEXNUM+1][VEXNUM+1];//邻接矩阵;

int val[VEXNUM+1][VEXNUM+1];//权值;

};

void create(struct Graph *);//创建图;

void min_length(struct Graph *);//最短路径实现函数;

void main()

{  

struct Graph *g=NULL;

g=(struct Graph *)malloc(sizeof(struct Graph));//分配空间;

create(g);

min_length(g);

}

void create(struct Graph *g)

{

int i,j,n,x,y,z;

FILE *fp;

fp=fopen("E:\\min1.txt","r");


for(n=1;n<=VEXNUM;n++)

   g->vexs[n]=n; 

for(i=1; i<=VEXNUM; i++)

        for(j=1; j<=VEXNUM; j++){

g->a[i][j] = 0;

g->a[j][i] = g->a[i][j];

}

for(i=0; i<ARCNUM; i++){

//fscanf(fp,"%d,%d,%d",&x,&y,&z);错误输入格式

fscanf(fp,"%d%d%d",&x,&y,&z);// printf("%d %d %d\n",x,y,z);

g->a[x][y] = 1;

g->a[y][x]=g->a[x][y];

g->val[x][y]=z;

g->val[y][x]=g->val[x][y];

}

fclose(fp);

for(i=1; i<=VEXNUM; i++)

{

for(j=1; j<=VEXNUM; j++)

if(g->val[i][j]<0)

g->val[i][j]=0;

}

/*for(i=1; i<=VEXNUM; i++)

{

for(j=1; j<=VEXNUM; j++)

{

printf("%d\t",g->a[i][j]);

}

printf("\n");

}

printf("\n");printf("\n");printf("\n");

for(i=1; i<=VEXNUM; i++)

{

for(j=1; j<=VEXNUM; j++)

if(g->val[i][j]>0)

printf("%d\t",g->val[i][j]);

else{

g->val[i][j]=0;

printf("%d\t",g->val[i][j]);

}

printf("\n");

}*/   //显示邻接矩阵

}

void min_length(struct Graph *g)

{

int disk[VEXNUM+1];

int pre[VEXNUM+1];

int i,k,x,y;

int s=1;

for(i=1;i<=VEXNUM;i++){

pre[i]=0;

if(g->a[1][i]==1)

disk[i]=g->val[1][i];

else

disk[i]=INT_MAX;

}

disk[1]=0;pre[1]=1;

printf("删除结点:1\n");

while(s<VEXNUM){

int min=INT_MAX;

for(i=1;i<=VEXNUM;i++)

if(pre[i]==0&&min>disk[i])

min=disk[i];

for(i=1;i<=VEXNUM;i++)

if(pre[i]==0&&min==disk[i]){

k=i;

break;

} pre[k]=1;

printf("删除结点:%d\n",k);

for(i=1;i<=VEXNUM;i++)

{

if(pre[i]==0&&g->a[k][i]==1){

x=disk[i];y=disk[k]+g->val[i][k];

if(x>y)

disk[i]=y;

}

}

s++;

}

for(i=1;i<=VEXNUM;i++)

printf("disk[%d]=%d\n",i,disk[i]);//for(i=1;i<=VEXNUM;i++)

}


附:图的临界表存储结构程序实现:

#include <stdio.h>

#include <stdlib.h>

#define  MaxVertexNum 100

typedef char VertexType;  //自定义定点类型

typedef struct node   //边表节点

{

int adjvex;

node* next;

}EdgeNode;

typedef struct     //顶点表节点

{

VertexType vertex;

EdgeNode* firstedge;

}VertexNode;

typedef VertexNode AdjList[MaxVertexNum];  //自定义定点表节点类型

typedef struct

{

AdjList adjlist;

int n,e;  //顶点数跟边数

}ALGraph; //图的结构体

void create(ALGraph*);

void main()

{

ALGraph* G= (ALGraph*)malloc(sizeof(ALGraph));  //创建图变量,并且分配空间

create(G);

for (int i=0;i< G->n;i++)

{

printf("%d->",i);

while(G->adjlist[i].firstedge!=NULL)

{

printf("%d->",G->adjlist[i].firstedge->adjvex);

G->adjlist[i].firstedge=G->adjlist[i].firstedge->next;

}

printf("\n");

}

}

void create(ALGraph* G)

{

int i,j,k,w,v;

EdgeNode *s;

printf("读入顶点数和边数");

scanf("%d,%d",&G->n,&G->e);

for (i=0;i<G->n;i++) //初始化

{

fflush(stdin);  //用来清空输入缓存,以便不影响后面输入的东西

printf("建立顶点表");

G->adjlist[i].vertex=getchar();

G->adjlist[i].firstedge=NULL;

}

printf("建立边表\n");

for (k=0;k<G->e;k++)

{

printf("读入(vi-vj)的顶点对序号");

scanf("%d,%d",&i,&j);

s=(EdgeNode*)malloc(sizeof(EdgeNode));

s->adjvex=j;

s->next=G->adjlist[i].firstedge;  //插入表头

G->adjlist[i].firstedge=s;

//如果是无向图,则需要创建下面操作

/* s=(EdgeNode*)malloc(sizeof(EdgeNode));

s->adjvex=i;

s->next=G->adjlist[j].firstedge;

G->adjlist[j].firstedge=s;  */

}

}


时间: 2024-11-08 02:01:37

数据结构之图的最短路径的相关文章

数据结构 -- 图的最短路径 Java版

作者版权所有,转载请注明出处,多谢.http://www.cnblogs.com/Henvealf/p/5574455.html 上一篇介绍了有关图的表示和遍历实现.数据结构 -- 简单图的实现与遍历 (Java)现在就来看看关于求图的最短路径的问题: 注意:本人学习图的时候看的书是: <<数据结构与算法 Java语言版>> (美)Adam Drozdek/著 周翔/译 机械工业出版社出版 由于要仔细讲解内容过多并且本人水平有限,推荐大家找出这本书来看,本篇文章主要是对其中Dijk

数据结构:单源最短路径--Dijkstra算法

Dijkstra算法 单源最短路径 给定一带权图,图中每条边的权值是非负的,代表着两顶点之间的距离.指定图中的一顶点为源点,找出源点到其它顶点的最短路径和其长度的问题,即是单源最短路径问题. Dijkstra算法 求解单源最短路径问题的常用方法是Dijkstra(迪杰斯特拉)算法.该算法使用的是贪心策略:每次都找出剩余顶点中与源点距离最近的一个顶点. 算法思想 带权图G=<V,E>,令S为已确定了最短路径顶点的集合,则可用V-S表示剩余未确定最短路径顶点的集合.假设V0是源点,则初始 S={V

带权图的最短路径算法(Dijkstra)实现

一,介绍 本文实现带权图的最短路径算法.给定图中一个顶点,求解该顶点到图中所有其他顶点的最短路径 以及 最短路径的长度.在决定写这篇文章之前,在网上找了很多关于Dijkstra算法实现,但大部分是不带权的.不带权的Dijkstra算法要简单得多(可参考我的另一篇:无向图的最短路径算法JAVA实现):而对于带权的Dijkstra算法,最关键的是如何“更新邻接点的权值”.本文采用最小堆主辅助,以重新构造堆的方式实现更新邻接点权值. 对于图而言,存在有向图和无向图.本算法只需要修改一行代码,即可同时实

43. 蛤蟆的数据结构笔记之四十三最短路径之迪杰斯特拉(Dijkstra )算法

43. 蛤蟆的数据结构笔记之四十三最短路径之迪杰斯特拉(Dijkstra )算法 本篇名言:"辛勤的蜜蜂永没有时间悲哀.--布莱克" 这次来看下Dijkstra )算法.还是老方法,先原理,后实现.代码来自网络. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47046031 1.  最短路径 最短路径问题是图论研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短路径. 管道铺设.线路安排

数据结构:图的实现--邻接矩阵

图结构的邻接矩阵实现 为了表现图中顶点之间的关联,我们可以使用邻接矩阵来实现图结构.所谓的邻接矩阵,就是一个反应边与边之间联系的二维数组.这个二维数组我们用matrix[numV][numV]表示,其中numV是顶点数. 对于无权图 若顶点Vi和Vj之间有边,则matrix[Vi][Vj]=1;否则matrix[Vi][Vj]=0. 对于有权图 若顶点Vi和Vj之间有边,且权值为weight,则matrix[Vi][Vj]=weight;否则matrix[Vi][Vj]=0或MAXWEIGHT(

数据结构之图 Part2 - 1

邻接矩阵 网上很少有C# 写图的数据结构的例子,实际的项目中也从来没用过Array 这坨东西,随手写个,勿喷. namespace LH.GraphConsole { public struct Graph { public Graph(int vertexNumber, int edgeNumber) { VertexNumber = vertexNumber; EdgeNumber = edgeNumber; Vertexs = new string[VertexNumber]; Edges

数据结构之图 Part1

Part 1 预计使用7天的时间来过掉图相关的数据结构.第一天主要是一天图的基本概念,熟练掌握定义是一切交流和沟通的基础. 1定义 1.1图 有穷非空顶点,外加边. G(V,E) Graph Vertex Edge 顶点就是 点,有穷非空. 顶点之间的关系就是边,边可空. 1.2 分类 无向边:无方向的边. 有向边:有方向的边,弧. 简单图:无重复边和自己到自己的顶点. 带权的图称为网. 无向图的度:顶点的边数. 有向图的度:顶点的弧的数量分为入度和出度. 连通图:任意两点有路径. 生成树:无向

数据结构:图--拓扑排序

拓扑排序 拓扑排序 在实际应用中,有向图的边可以看做是顶点之间制约关系的描述.把顶点看作是一个个任务,则对于有向边<Vi,Vj>表明任务Vj的完成需等到任务Vi完成之后,也就是说任务Vi先于任务Vj完成.对于一个有向图,找出一个顶点序列,且序列满足:若顶点Vi和Vj之间有一条边<Vi,Vj>,则在此序列中顶点Vi必在顶点Vj之前.这样的一个序列就称为有向图的拓扑序列(topological order). 步骤 从有向图中选取一个没有前驱(入度为0)的顶点输出. 删除图中所有以它为

数据结构:图的实现--邻接表

使用邻接表实现图结构 当图中的边数较少时,用邻接表来实现图结构,则会浪费很多内存空间.因此,考虑另一种实现图结构的方法:邻接表.在邻接表中主要有两种节点结构体: 顶点节点 边节点 直接看代码 类定义 #include<iostream> #include<iomanip> using namespace std; //最大权值 #define MAXWEIGHT 100 //边节点 typedef struct edgenode_tag { int adjvex; //邻接点 in