⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 7_42.cpp

📁 以邻接表为存储结构实现求从源点到其余各顶点的最短路径的Dijkstra算法
💻 CPP
字号:
#include <stdio.h> 
#include <malloc.h>
#include <string.h>
#include <stdlib.h>
#define VertexType char //数据元素类型
int Vn=6,En=8; //实际顶点数,边或弧数
#define INFINITY 10000 
#define TRUE 1 
#define FALSE 0 
#define vexnum 6 
char Ve[vexnum+1]="ABCDEF";


// 邻接表存储结构
typedef struct ArcNode
{
	int adjvex; //邻接点在顺序表中的位置
	int info;
	struct ArcNode *nextarc; //指向下一个邻接点
}ArcNode,*AdjLink;

// 表头指针结构
typedef struct VNode
{
	VertexType data;
	//AdjLink HAdjV; //邻接点链表头指针
	ArcNode *firstarc;
} VNode;

// 图的邻接表存储结构
VNode AdjList[vexnum];
// 图的初始化
void GraphAdjLInit(VertexType *vs)
{
	if (Vn>vexnum) Vn=vexnum;
	for (int k=0; k<vexnum; ++k)
	{
		if (k<Vn) AdjList[k].data=vs[k];
		else AdjList[k].data=NULL;
		AdjList[k].firstarc=NULL;
	}
} //GraphAdjLInit

// 求顶点v在图G中的位置(下标)
int LocationV(VertexType v)
{
	for (int k=0; k<Vn; ++k)
		if (AdjList[k].data==v) return k;
	if (k>=vexnum) return -1;
	AdjList[k].data=v;
	Vn=k+1;
	AdjList[Vn].data=NULL;
	return k;
} //LocationV

// 通过输入“边”建立图的邻接表存储结构
void GraphAdjCreate(char v,char w,int weight)
{
	int j1=0,j2=0;
	AdjLink p,q;
        j1=LocationV(v);
       j2=LocationV(w); 
	 if (j1==-1) return;
	if (j2==-1) return;
		p=(AdjLink) malloc(sizeof(VNode));
		p->adjvex=j2;
		p->info=weight;
		p->nextarc=NULL;
		if (!AdjList[j1].firstarc) {AdjList[j1].firstarc=p;}
		else
		{
			q=AdjList[j1].firstarc;
			while (q->nextarc) q=q->nextarc;
			q->nextarc=p;
		}
	
} //GraphAdjCreate

// 显示图的邻接表存储结构
void GraphAdjLPrint()
{
	for(int k=0; k<Vn; ++k)
	{
		printf("%d [%c",k,AdjList[k].data);
		AdjLink p=AdjList[k].firstarc;
		if(p)printf(",*]->[");	
		while(p)
		{ if(p->nextarc)
		  printf("%d,%d,%d,*]->[",k,p->adjvex,p->info);
		else printf("%d,%d,%d",k,p->adjvex,p->info);
			p=p->nextarc;
		}
		printf(",^]\n");
	}
}//GraphAdjLPrint
int edgelen(int v,int w)
{AdjLink p=AdjList[v].firstarc;
while(p->adjvex!=w)p=p->nextarc;
return p->info;
}

void ALGraph_DIJ(int v0,int P[][vexnum],int D[])
//在邻接表存储结构上实现迪杰斯特拉算法
{
  int v; 
  int w; 
  int min; 
  int i,j;
  int final[vexnum];  
  for(v=0;v<vexnum;v++)
    D[v]=INFINITY;
  for(AdjLink p=AdjList[v0].firstarc;p;p=p->nextarc)
    D[p->adjvex]=p->info; //给D数组赋初值
  for(v=0;v<vexnum;v++)
  {
    final[v]=FALSE;
    for(w=0;w<vexnum;w++) P[v][w]=-1; //设空路径
    if(D[v]<INFINITY)
    {
      P[v][v0]=v;
      //P[v][v]=1;
    }
  }//for
  D[v0]=0;final[v0]=TRUE; //初始化
  for(i=1;i<vexnum;i++)
  {
    min=INFINITY;
    for(w=0;w<vexnum;w++)
      if(!final[w])
        if(D[w]<min) //尚未求出到该顶点的最短路径
        {
          v=w;
          min=D[w];
        }
    final[v]=TRUE;
    for(p=AdjList[v].firstarc;p;p=p->nextarc)
    {
      w=p->adjvex;
      if(!final[w]&&(min+(p->info)<D[w])) //符合迪杰斯特拉条件
      {
        D[w]=min+edgelen(v,w);
       for(j=0;j<vexnum;j++)
		P[w][j]=P[v][j];
        P[w][v]=w; //构造最短路径
      }
    }//for
  }//for
}//ALGraph_DIJ*/


void main()
{ 
printf("以邻接表为存储结构实现求从源点到其余各顶点的最短路径的Dijkstra算法\n");
GraphAdjLInit(Ve);
GraphAdjLPrint(); 
/***********弧的信息***************/
GraphAdjCreate(Ve[0],Ve[2],10);
GraphAdjCreate(Ve[0],Ve[4],30);
GraphAdjCreate(Ve[0],Ve[5],100);
GraphAdjCreate(Ve[1],Ve[2],5);
GraphAdjCreate(Ve[2],Ve[3],50);
GraphAdjCreate(Ve[3],Ve[5],10);
GraphAdjCreate(Ve[4],Ve[3],20);
GraphAdjCreate(Ve[4],Ve[5],60);

printf("\n初始有向图为:(v,w,weight) \n");
GraphAdjLPrint();

int P[vexnum][vexnum];
int D[vexnum];
int i,j,v0=0;
ALGraph_DIJ(0,P,D);
    //输出最短路径 
    for ( i = 0; i <vexnum; i++) 
    { 
        printf("Path %c to %c:\n",Ve[v0],Ve[i]); 
        if ( P[i][v0] != -1 )   //存在路径则输出 
        { 
            for (j = v0; j != -1; j = P[i][j]) 
            { 
                if (j != v0) 
                    printf("→"); 
                printf("%c",Ve[j]); 
            } 
            printf("\n"); 
        } 
        printf("Length:%d\n",D[i]); 
        printf("\n"); 
    } 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -