这个测试用的是下面这个图:
9 16
0 1 2 3 4 5 6 7 8
0 1 1
0 2 5
1 2 3
1 4 5
1 3 7
2 4 1
2 5 7
3 4 2
3 6 3
4 6 9
4 5 3
4 7 9
5 7 5
6 7 2
6 8 7
7 8 4
运行结果如下:
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<cmath>
#define inf 0x3f3f3f3f
#include<algorithm>
typedef struct Graph
{
int vertex[100];
int arc[100][100];
int num_ver,num_edge;
} Mygraph;
void create(Mygraph *g)//建图
{
int i,j,tmp,a,b,c;
scanf("%d%d",&g->num_ver,&g->num_edge);//输入结点数和边数
for(i=0; i<g->num_ver; i++)//输入结点集
scanf("%d",&g->vertex[i]);
for(i=0; i<g->num_ver; i++)//边的权值初始化
{
for(j=0; j<g->num_ver; j++)
g->arc[i][j]=inf;
}
for(i=0; i<g->num_edge; i++)//输入边的权值
{
scanf("%d%d%d",&a,&b,&c);
g->arc[a][b]=c;
g->arc[b][a]=c;
}
}
void ShortPath(Mygraph *g,int x)
{
int i,j,k,tmp,Min;
int adjver[100];
int final[100];
int sum=0;
memset(final,0,sizeof(final));
int lowcost[100];
final[x]=1;
//其实这个算法跟prime算法实现很相似,制作了一些很小的改动
//就新增了一个final数组,用来记录这个点是够走过,如果走过就不再走,因为如果记录final[k]=1,那么
//就是认为到达k点最短路径就是当前的样子,不能是其他的
for(i=0; i<g->num_ver; i++)
{
lowcost[i]=g->arc[x][i];
adjver[i]=x;
}
lowcost[x]=0;
for(i=0; i<g->num_ver; i++)
{
Min=inf;//Min用来找最小的边权值
j=0;
while(j<g->num_ver)
{
if(!final[j]&&lowcost[j]<Min)
{
Min=lowcost[j];
k=j;
}
j++;
}
//现在k里存的是从当前以选择结点出发可以到达的最近的结点(即边权值最小)
final[k]=1;
for(j=0; j<g->num_ver; j++)
{
if(!final[j]&&Min+g->arc[k][j]<lowcost[j])
{
lowcost[j]=Min+g->arc[k][j];
adjver[j]=k;
}
}
}
printf("adjver[]:\n");
for(i=0; i<g->num_ver; i++)
printf("%3d ",adjver[i]);
puts("");
printf("lowvost[]:\n");
for(i=0; i<g->num_ver; i++)
printf("%3d ",lowcost[i]);
puts("");
/*打印0到8的路径*/
/*
int ans[10];
int temp=8,cout_ans=0;
ans[cout_ans++]=8;
while(adjver[temp]!=0){
ans[cout_ans++]=adjver[temp];
temp=adjver[temp];
}
ans[cout_ans++]=0;
for(i=cout_ans-1;i>=0;i--)
printf("%d ",ans[i]);
printf("\n");
*/
}
int main()
{
int i,j,k,x,y,z;
Mygraph G;
printf("第一次测验\n");
create(&G);
ShortPath(&G,1);
printf("第二次测验\n");
create(&G);
ShortPath(&G,0);
return 0;
}
/*
5 6
0 1 2 3 4
0 1 9
0 2 2
0 4 6
1 2 3
2 3 5
3 4 1
9 16
0 1 2 3 4 5 6 7 8
0 1 1
0 2 5
1 2 3
1 4 5
1 3 7
2 4 1
2 5 7
3 4 2
3 6 3
4 6 9
4 5 3
4 7 9
5 7 5
6 7 2
6 8 7
7 8 4
*/