数据结构之图的最短路径

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构之图的最短路径相关的知识,希望对你有一定的参考价值。

最短路径程序实现:

#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;  */

  

   }  

}  




本文出自 “11773640” 博客,请务必保留此出处http://11783640.blog.51cto.com/11773640/1868227

以上是关于数据结构之图的最短路径的主要内容,如果未能解决你的问题,请参考以下文章

数据结构之图:求所有节点之间的最短路径,用啥算法时间复杂度小?求答案与解释

数据结构与算法基础之图的应用-最短路径

求图的最短路径 c语言

非线性数据结构--图的最短路径问题与动态规划问题的区别

ACM入门之图论习题

数据结构图之三(最短路径--迪杰斯特拉算法——转载自i=i++