迪杰斯特拉算法——C语言

初学者。如果有误请指正,欢迎联系QQ2684162190

#include<stdio.h>
#include<stdlib.h>
#define INFIN 65535
#define MAX_VERTEX_NUM 20
int final[6];
typedef enum{DG,DN,UDG,UDN}GraphKind;	//有向图,有向网,无向图,无向网 
typedef struct ArcCell
{    
	int  adj;			//顶点的关系类型 
    int *info=NULL;     		//弧的相关信息指针 
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

typedef struct{
	char vexs[MAX_VERTEX_NUM];		//顶点向量
	AdjMatrix arcs;				//邻接矩阵 
	int vexnum,arcnum;			//图当前顶点数与弧数 
	GraphKind kind;				//图种类标志 
}MGraph;
int CreateDG(MGraph &G)
{
	return 0;
}
int CreateDN(MGraph &G)
{
	return 0;
}
int CreateUDG(MGraph &G)
{
	return 0;
}
int LocateVex(MGraph &G,char v)
{
	int i;
	for(i=0;i<G.vexnum;i++)
	{
		if(v==G.vexs[i])
			return i;
	}
	if(i==G.vexnum)
		return 65535; 
}
int CreateUDN(MGraph &G)
{
//	printf("输入顶点数(按enter结束):");
//	scanf("%d",&G.vexnum);	//存储顶点数与弧数 
//	getchar();
//	printf("输入弧数(按enter结束):");
//	scanf("%d",&G.arcnum);
//	getchar();
//	printf("输入顶点信息(char):");
//	int i,j;
//	for(i=0;i < G.vexnum;i++)		//构造顶点向量 
//		scanf("%c",&G.vexs[i]); 
//	getchar();
//	for(i=0;i<G.vexnum;i++)
//		for(j=0;j < G.vexnum;j++)
//			G.arcs[i][j].adj=INFIN;
//	char v1,v2;
//	int w;
//	printf("输入依附于一条边的顶点与权值v1,v2,w:");
//
//	for(int k=0;k<G.arcnum;k++)
//	{
//		scanf("%c%c%d",&v1,&v2,&w);
//		i=LocateVex(G,v1);				//寻找v1在G中的位置 
//		j=LocateVex(G,v2);
//		G.arcs[i][j].adj=w;
//		G.arcs[j][i].adj=G.arcs[i][j].adj;		//对称赋值 
//	}

	G.vexnum = 6;
	G.arcnum = 10;
	int i,j;
	for(i=0;i<G.vexnum;i++)
	{
		G.vexs[i]=(char)'a'+i;
	}
	for(i=0;i<G.vexnum;i++)
		for(j=0;j < G.vexnum;j++)
			G.arcs[i][j].adj=INFIN;
	G.arcs[0][1].adj=5;
	G.arcs[2][0].adj=8;
	G.arcs[0][3].adj=7;
	G.arcs[5][0].adj=3;
	G.arcs[1][2].adj=4;
	G.arcs[3][2].adj=5;
	G.arcs[4][3].adj=5;
	G.arcs[5][4].adj=1;
	G.arcs[3][5].adj=6;
	G.arcs[2][5].adj=9;
	return 1;
}

int CreateGraph(MGraph &G)
{
//	printf("输入图的类型(0,1,2,3):");
//	scanf("%d",&G.kind);		//修改图的类型
	G.kind=UDN;
	switch(G.kind)
	{
		case DG:return CreateDG(G);
		case DN:return CreateDN(G);
		case UDN:return CreateUDN(G);
		case UDG:return CreateUDG(G);
		default :return 0;
	}
}

void shortPath_DJT(int p[][6],MGraph &G,int v0,int D[])
{
	//有向网G到的v0顶点到其余顶点V的最短路径p[v]及其带权志长度D【v】
	//若p[v][w]为1则w是v0到v当前求得最短路径上的顶点
	//final【v】为 当且仅当属于S即已经求得从v0到v的最短路径
	int v,w,min,i; 
	for(v=0;v<G.vexnum;v++)
	{
		final[v] = 0;
		D[v] = G.arcs[v0][v].adj;
		for(w=0;w<G.vexnum;w++)
			p[v][w]=0;			//设置空路径 
		if(D[v]<65535)
		{
			p[v][v0]=1;				//v0是v0到v最短路径上的点 
			p[v][v]=1;				//v是v0到v最短路径上的点 
		}
	}
	D[v0] = 0;				//v0属于S集
	final[v0]=1;
	//开始主循环,每次求得v0到某个顶点的最短路径并增加v到s集 
	for(i = 1;i<G.vexnum;i++)
	{
		min = 65535;
		for(w=0;w<G.vexnum;w++)		//w顶点距离v0顶点更近 
			if(!final[w])
				if(D[w]<min)
				{
					v=w;
					min = D[w];
				}
		final[v]=1;				//距离v0最近的v顶点加入s集 
		for(w=0;w<G.vexnum;w++)		//更新当前最短路径及距离 
			if(!final[w]&&(min+G.arcs[v][w].adj<D[w]))
			{
				D[w]=min+G.arcs[v][w].adj;
				*p[w]=*p[v];
				p[w][w]=1;		
			}
	} 
}
int main()
{
	MGraph *G=(MGraph*)malloc(sizeof(MGraph));
	CreateGraph(*G);
	int p[6][6],D[6];
	int v0=0;
	shortPath_DJT(p,*G,v0,D);
	int m;
	printf("输入要查找从v0到第几个点<6\n");
	scanf("%d",&m);
	printf("最短路径是%d\n",D[m]);
	int i;
	for(i=0;i<G->vexnum;i++)
	{
		if(p[m][i]==1)
			printf("%c",G->vexs[i]);
	}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值