国产探花免费观看_亚洲丰满少妇自慰呻吟_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;}

運行測試結果如下:


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 恭城| 香格里拉县| 黄大仙区| 诏安县| 申扎县| 淮北市| 泸州市| 正安县| 兴隆县| 博罗县| 南宁市| 新巴尔虎右旗| 西和县| 墨竹工卡县| 且末县| 禄丰县| 绥阳县| 怀来县| 东港市| 上饶县| 桐乡市| 鄢陵县| 文成县| 宣威市| 左云县| 庐江县| 大港区| 于都县| 休宁县| 玉田县| 秭归县| 密山市| 百色市| 溧水县| 景东| 拉萨市| 旅游| 河津市| 鄄城县| 丰顺县| 汽车|