7.42以邻接表作存储结构实现求从源点到其余各顶点的最短路径的Dijkstra算法。

  • Post author:
  • Post category:其他


#include<stdio.h>
#include<stdlib.h>
#define maxsize 100
#define INFINITY 65535
typedef int InfoType;
typedef int VexType;
typedef struct ArcNode{
	int adjvex;
	struct ArcNode *nextarc;
	InfoType info;
}ArcNode;
typedef struct VNode{
	VexType data;
	ArcNode *firstarc;
}VNode,AdjList[maxsize];
typedef struct{
	AdjList vertices;
	int vexnum,arcnum;
	int kind;
}AGraph; 

int locate(AGraph *G,VexType vex){
	int i;
	for(i=0;i<G->vexnum;i++){
		if(G->vertices[i].data==vex)
			return i;
	}
	return -1;
}

AGraph *creat()
{
    AGraph *G=(AGraph*)malloc(sizeof(AGraph));
    printf("请输入顶点数目:");
    scanf("%d", &(G->vexnum));
    printf("请输入弧的数目:");
    scanf("%d", &(G->arcnum));
     
    int i,k;
    VexType vex;
    VexType v1, v2,info;
    printf("请输入顶点信息:\n");
    for (i = 0; i < G->vexnum; i++)
    {
        scanf("%d", &vex);
        G->vertices[i].data = vex;
        G->vertices[i].firstarc = NULL;
    }
    
    printf("请输入弧的信息:\n");
    for (k = 0; k < G->arcnum; k++)
    {
    	scanf("%d%d%d", &v1, &v2,&info);  
        int a = locate(G, v1);      
        int b = locate(G, v2);      
    
        ArcNode *p = (ArcNode*)malloc(sizeof(ArcNode));
        p->adjvex = b;p->info=info;
        p->nextarc = G->vertices[a].firstarc;
        G->vertices[a].firstarc = p;
    }
    return G;
}

int sortP(int dist[],int n,int set[]){
	int k=0,min,i;
	while(set[k]==1) k++;
	min=dist[k];
	for(i=k+1;i<n;i++){
		if(set[i]==0&&dist[i]<min){
			k=i;min=dist[i];
		}
	}
	return k;
}

void ShortestPath(AGraph *G,int v0){
	int n=G->vexnum;
	int dist[n],path[n],set[n];
	ArcNode *p;
	int vl=locate(G,v0),i;
	for(i=0;i<n;i++){
		dist[i]=INFINITY;
		path[i]=-1;
		set[i]=0;
	}
	for(p=G->vertices[vl].firstarc;p;p=p->nextarc){
		dist[p->adjvex]=p->info;
		path[p->adjvex]=vl;
	}
	set[vl]=1;
	int k,min,m;
	for(i=0;i<n-1;i++){
		min=sortP(dist,n,set);
		set[min]=1;
		
		for(p=G->vertices[min].firstarc;p;p=p->nextarc){
			m=p->adjvex;
			if(set[m]==0&&dist[m]>dist[min]+p->info){
				dist[m]=dist[min]+p->info;
				path[m]=min;
			}
		}
	}
	
	for(i=0;i<n;i++){
		printf("%d %d %d\n",set[i],dist[i],path[i]);
	}
} 


int main(){
	AGraph *G=creat();
	ShortestPath(G,0);
	return 0;
}

在这里插入图片描述

输入:
请输入顶点数目:7
请输入弧的数目:12
请输入顶点信息:
0 1 2 3 4 5 6
请输入弧的信息:
0 1 4 0 2 6 0 3 6 1 2 1 3 2 2 1 4 7 3 5 5 2 4 6 2 5 4 5 4 1 4 6 6 5 6 8
输出:
1 65535 -1
1 4 0
1 5 1
1 6 0
1 10 5
1 9 2



版权声明:本文为gdyhvy原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。