// exam1.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <stack>
using namespace std;
#define MAXVEX 20
#define INT_MAX 10000
typedef struct ArcNode
{
int adj;
void* info;
}ArcNode;
typedef ArcNode AdjMat[MAXVEX][MAXVEX];
typedef struct
{
int vexnum;
int arcnum;
AdjMat am;
}Graph;
void InitGraph(Graph& G)
{
cout<<"Please enter the number of vertex:"<<endl;
cin>>G.vexnum;
cout<<"Please enter the Arc of the graph:"<<endl;
cout<<"head tail weight"<<endl;
for(int i=0;i<G.vexnum;i++)
{
for(int j=0;j<G.vexnum;j++)
{
if(i==j)
{
G.am[i][j].adj=0;
}
else
{
G.am[i][j].adj=INT_MAX;
}
}
}
int vex1,vex2,w;
while(cin>>vex1>>vex2>>w)
{
G.am[vex1][vex2].adj=w;
}
}
void ShortestPath_DIJ(Graph G,bool** path)
{
int *D;
D=(int*)malloc(G.vexnum*sizeof(int));
bool *final;
final=(bool*)malloc(G.vexnum*sizeof(bool));
memset(final,0,G.vexnum*sizeof(bool));
for(int i=0;i<G.vexnum;i++)
{
D[i]=INT_MAX;
if(G.am[0][i].adj<INT_MAX)
{
D[i]=G.am[0][i].adj;
}
path[i][i]=true; //terminal point
path[i][0]=true; //starting point
}
final[0]=true;
for(int i=1;i<G.vexnum;i++)
{
int min=INT_MAX;
int min_indx=-1;
for(int j=0;j<G.vexnum;j++)
{
if(final[j]==false)
{
if(D[j]<min)
{
min=D[j];
min_indx=j;
}
}
}
final[min_indx]=true;
if(min_indx!=-1)
{
for(int j=1;j<G.vexnum;j++)
{
if(final[j]==false)
{
if(D[j]>D[min_indx]+G.am[min_indx][j].adj)
{
D[j]=D[min_indx]+G.am[min_indx][j].adj;
for(int k=0;k<G.vexnum;k++)
{
path[j][k]=path[min_indx][k];
}
path[j][j]=true;
}
}
}
}
}
cout<<"The shortest path from v0 to "<<endl;
for(int j=0;j<G.vexnum;j++)
{
cout<<"v"<<j<<":"<<D[j]<<endl;
for(int i=0;i<G.vexnum;i++)
{
cout<<path[j][i]<<" ";
}
cout<<endl;
}
}
int main(void)
{
Graph G;
InitGraph(G);
bool **path;
path=(bool**)malloc(G.vexnum*sizeof(bool*));
for(int i=0;i<G.vexnum;i++)
{
path[i]=(bool*)malloc(G.vexnum*sizeof(bool));
memset(path[i],false,G.vexnum*sizeof(bool));
}
ShortestPath_DIJ(G,path);
system("pause");
return 0;
}
最短路径---Dijkstra迪杰特斯拉算法---《数据结构》严蔚敏
最新推荐文章于 2024-08-19 12:02:02 发布