#include<stdio.h>
//#include"graph.h"
#include<iostream>
using namespace std;
typedef int InfoType;
#define MAXV 100//最大顶点个数;
//以下为定义邻接矩阵类型
typedef struct
{
int no;//顶点编号;
InfoType info;//顶点其他信息,这里用于存放边的权值;
}VertexType;//顶点类型;以后在这里改类型;
typedef struct
{
int edges[MAXV][MAXV];//邻接矩阵
int n,e; //顶点数,弧数
VertexType vexs[MAXV]; //存放顶点信息
}MGraph; //图的;邻接矩阵类型
//以下定义邻接表的类型
typedef struct ANode //弧的结点结构类型
{
int adjvex; //该弧的终点位置
struct ANode *nextarc;//指向下一条弧的指针
InfoType info; //该弧的相关信息,这里用于存放权值
}ArcNode; //
typedef int Vertex;
typedef struct Vnode //邻接表头结点的类型
{
Vertex data; //顶点信息
ArcNode *firstarc; // 指向第一条弧
}VNode;
typedef VNode AdjList[MAXV]; //AdjList是邻接表类型
typedef struct
{
AdjList adjlist; //图中顶点数n和边数e
int n,e; //图的邻接表类型
}ALGraph;
#define INF 10000
void dispath(int dist[],int path[],int s[],int n,int v0)
{
int i;
printf("path:");
for(i=0;i<n;i++)
printf(" %3d",path[i]);
printf("\n");
for(i=0;i<n;i++)
{
if(s[i]==1&&i!=v0)
{
printf("从%d到%d的最短距离长度为:%d\t\n",v0,i,dist[i]);
}
else
printf("从%d到%d不存在路径\n",v0,i);
}
}
void dijkstra(MGraph g,int v0)
{
int dist[MAXV],path[MAXV];
int s[MAXV];
int mindis,i,j,u,n=g.n;
for(i=0;i<n;i++)
{
dist[i]=g.edges[v0][i];
s[i]=0;
if(g.edges[v0][i]<INF)
path[i]=v0;
else
path[i]=-1;
}
s[v0]=1;path[v0]=0;
for(i=0;i<n;i++)
{
mindis=INF;
u=-1;
for(j=0;j<n;j++)
{
if(s[j]==0&&dist[j]<mindis)
{
u=j;
mindis=dist[j];
}
}
s[u]=1;
for(j=0;j<n;j++)
{
if(s[j]==0)
{
if(g.edges[u][j]<INF&&dist[u]+g.edges[u][j]<dist[j])
{
dist[j]=dist[u]+g.edges[u][j];
path[j]=u;
}
}
}
}
printf("最短路径为:\n");
dispath(dist,path,s,n,v0);
}
int main()
{
int i,j,u=0;
MGraph g;
int A[MAXV][6]={
{INF,5,INF,7,INF,INF},
{INF,INF,4,INF,INF,INF},
{8,INF,INF,INF,INF,9},
{INF,INF,5,INF,INF,6},
{INF,INF,INF,5,INF,INF},
{3,INF,INF,INF,1,INF}};
g.n=6;
g.e=10;
for(i=0;i<g.n;i++)
for(j=0;j<g.n;j++)
g.edges[i][j]=A[i][j];
printf("\n");
dijkstra(g,u);
printf("\n");
return 0;
}
posted on 2013-05-15 19:15
天YU地___PS,代码人生 阅读(286)
评论(0) 编辑 收藏