#include <stdio.h>
typedef int Status;
#define OK 1
#define ERROR 0
#define MaxInt 32767 //表示极大值,即∞
#define MVNum 100
#define false -1
#define true 0 //最大顶点数
typedef char VerTexType; //顶点的数据类型为字符型
typedef int ArcType; //边的权值类型为整型
typedef struct{
//****
VerTexType vexs[MVNum];//顶点的信息
ArcType arcs[MVNum][MVNum];
int vexnum,arcnum,min ;
}AMGraph;
int LocateVex(AMGraph &G,VerTexType v)
{
//****
/* 初始条件: 图G存在,v和G中顶点有相同特征*/
/* 操作结果: 若G中存在顶点u,则返回该顶点在图中位置;否则返回-1 */
for(int i=0;i<G.vexnum;i++)
{
if(v==G.vexs[i])
return i;
else return -1;
}
}
Status CreateUDN(AMGraph &G) //采用邻接矩阵表示法,创建无向图G
{
int i, j,k;
VerTexType v1,v2;
/* printf("请输入边数和顶点数:"); */
G.vexnum=10;
G.arcnum=14;
for (i = 0; i <G.vexnum; ++i)/* 初始化图 */
{
G.vexs[i]='A'+i;//为A到J的顺序输入方法
}
for (i = 0; i < G.vexnum; ++i)/* 初始化图 */
{
for ( j = 0;j < G.vexnum; ++j)
{
G.arcs[i][j]=MaxInt;
}
}//a到各顶点的距离;
G.arcs[0][1]=2;
G.arcs[0][3]=1;
G.arcs[0][2]=2;
//B
G.arcs[1][3]=1;
G.arcs[1][4]=1;
//C
G.arcs[2][4]=1;
G.arcs[2][3]=4;
//E
G.arcs[4][5]=2;
//F
G.arcs[5][9]=4;
G.arcs[5][8]=1;
//H
G.arcs[7][9]=1;
G.arcs[7][6]=3;
//J
G.arcs[9][8]=4;
//I
G.arcs[8][6]=1;
for(i = 0; i < G.vexnum; ++i)
{
for(j = i; j < G.vexnum; ++j)
{
G.arcs[j][i] =G.arcs[i][j];
}
}
return OK;
}
void ShowGraph(AMGraph &G)
{
int i,j;
printf("------Start------\n");
printf("共有%d个顶点,%d条边:\n ",G.vexnum,G.arcnum);
for(i=0;i<G.vexnum;i++)
printf("%3c",G.vexs[i]);
printf("\n");
for(i=0;i<G.vexnum;i++)
{
printf(" ");
for(j=0;j<G.vexnum;j++) {if(G.arcs[i][j]==MaxInt)printf(" -");else printf("%3d",G.arcs[i][j]);}
printf("%3c\n",G.vexs[i]);
}
printf("-------End-------\n");
}
void ShortestPath_DIJ(AMGraph& G, int v0, int D[], int Path[]) //迪杰斯特拉算法求解最短路径
{
//****
int n;
int min,v,w,S[MVNum],i;
n=G.vexnum;
for(int v=0;v<n;++v)
{
S[v]=false;
D[v]=G.arcs[v0][v];
if(D[v]<MaxInt) Path[v]=v0;
else Path[v]=-1;
}
S[v0]=OK;
D[v0]=0;
for(i=1;i<n;++i){
min=MaxInt;
for(w=0;w<n;++w)
if(!S[w]&&D[w]<min){v=w;min=D[w];}
S[v]=OK;
for(w=0;w<n;++w)
if(!S[w]&&(D[v]+G.arcs[v][w]<D[w]))
{
D[w]=D[v]+G.arcs[v][w];
Path[w]=v;
}
}
}
void CalcuPath(AMGraph &G,int Path[],char ABC[],int aim) //根据Path数组,计算从A点到第aim个结点的最短路径
{ //****
char b[MVNum];
int c=0,k,i;
for(k=aim; k!=0; k=Path[k]){
b[c]=G.vexs[k];c++;
}
b[c]=G.vexs[0];
for(i=0;i<=c;i++){
ABC[i]=b[c-i];
}
ABC[c+1]='\0';
}
int main()
{
AMGraph G;
int i,D[10],Path[10];
char ABC[10];
CreateUDN(G);
printf("\n------ 以下内容截屏提交学习通:------\n\n");
ShowGraph(G);
printf("\n");
ShortestPath_DIJ(G, 0, D , Path);
printf(" ");
for(i=0;i<10;i++) printf("%3d",i);printf("\n");
printf(" ");
for(i=0;i<10;i++) printf("%3c",'A'+i);printf("\n");
printf(" D[10]: ");
for(i=0;i<10;i++) printf("%3d",D[i]);printf("\n");
printf("Path[10]: ");
for(i=0;i<10;i++) printf("%3d",Path[i]);printf("\n\n");
for(i=0;i<10;i++)
{
CalcuPath(G,Path,ABC,i);
printf("从A到%c 的最短路径:%s\n",G.vexs[i],ABC);
}
return 0;
}