国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

圖之有權最短路徑-迪杰斯特拉

2019-11-08 20:06:58
字體:
來源:轉載
供稿:網友

采用鄰接矩陣表示圖,5點有權圖如下:

//main函數入口

#include <stdio.h>#include <string.h>#include <stdlib.h>#define MAXSIZE 20#define INFINITY 65535typedef char VertexType;typedef struct Graph  //鄰接矩陣表示法{	VertexType ver[MAXSIZE+1];	int edge[MAXSIZE][MAXSIZE];}Graph;void CreateGraph(Graph *g){	int i=0;	int j=0;	int VertexNum;	VertexType Ver;	PRintf("please input the vertex of graph:/n");	while('/n'!=(Ver=getchar()))		g->ver[i++]=Ver;	g->ver[i]='/0';	VertexNum=strlen(g->ver);	printf("input adjacency matrix of matrix:/n");	for(i=0;i<VertexNum;i++)	{		for(j=0;j<VertexNum;j++)			scanf("%d",&g->edge[i][j]);	}}void PrintGraph(Graph G){	int i,j;	int VertexNum=strlen(G.ver);	printf("vertex of graph:/n");	for(i=0;i<VertexNum;i++)		printf("%c",G.ver[i]);	printf("/n");	printf("adjacency matrix of graph:/n");	for(i=0;i<VertexNum;i++)	{		for(j=0;j<VertexNum;j++)			printf("%d",G.edge[i][j]);		printf("/n");	}}int CalVerNum(Graph G){	return strlen(G.ver);}void SetWeight(Graph *g)  //不鄰接點設置無窮大{	int i,j;	for(i=0;i<CalVerNum(*g);i++)		for(j=0;j<CalVerNum(*g);j++)		{			if(0==g->edge[i][j])				g->edge[i][j]=INFINITY;		}}void Dijkstra(Graph g,int first,int end){	int VertexNum=CalVerNum(g);	int i,j,k,mini;	int *used=(int *)malloc(sizeof(int)*VertexNum);  //動態申請內存 由于數組小標必須為常量 這里為變量	int *distance=(int *)malloc(sizeof(int)*VertexNum);	int *parent=(int *)malloc(sizeof(int)*VertexNum);	SetWeight(&g);	for(i=0;i<VertexNum;i++)	{		used[i]=0;		distance[i]=g.edge[0][i];		parent[i]=0;	}	used[0]=1;	for(i=0;i<VertexNum-1;i++)	{		j=0;		mini=INFINITY;		for(k=0;k<VertexNum;k++)			if((0==used[k])&&(distance[k]<mini))			{				mini=distance[k];				j=k;			}		used[j]=1;		for(k=0;k<VertexNum;k++)			if((0==used[k])&&(distance[k]>distance[j]+g.edge[j][k]))			{				distance[k]=distance[j]+g.edge[j][k];				parent[k]=j; //路徑求并			}	}	printf("%c to %c the least path:/n",g.ver[first],g.ver[end]);	i=end;	while(parent[i]!=0)	{		printf("%c",g.ver[parent[i]]);		i=parent[i];	}	printf("/n");	printf("length of the least path:%d/n",mini);	free(used);	free(distance);	free(parent);}int main(void){	int i,j;	Graph g;	CreateGraph(&g);	PrintGraph(g);	printf("please enter first and end number:/n");//輸入起點和終點的頂點序號	scanf("%d %d",&i,&j);	Dijkstra(g,i,j);	return 0;}

運行測試結果如下:


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 大关县| 大安市| 通化市| 台山市| 浮山县| 彭阳县| 镇平县| 鄂州市| 大冶市| 金坛市| 陇西县| 孝感市| 随州市| 蒙自县| 禄劝| 淮安市| 枞阳县| 南江县| 荣成市| 虞城县| 泽普县| 陇西县| 全州县| 盐山县| 清丰县| 吉林省| 永昌县| 兴和县| 民县| 岳阳市| 晋州市| 岱山县| 晴隆县| 临城县| 石嘴山市| 和硕县| 芒康县| 天长市| 射洪县| 文化| 苏州市|