您的位置:首页 > 编程语言

由最小生成树算法改到最短路径算法代码----为了区分两者的区别

2016-04-11 20:02 411 查看
前几天考试,最后一题是有关最小生成树的,但是由于好久没有看数据结构了,把最小生成树和最短路径算法搞混了 (二者本来就很相近)。今天首先写了最小生成树的算法,

然后将其代码复制粘贴,在原来的基础上稍作修改,就变成了最短路径算法。(二者最大的区别应该是对某一个标志数组的更新上,最小生成树是将集合V中的点,更新为到集合U中任意一点的最短距离,而最短路径则是将集合V中点更新为到源点的最短距离)。并且采用了同一个测试用例。

  希望对这两种算法模糊的同学起到一定的帮助作用,下面是最小生成树代码

//最小生成树
/*
6
0 6 1 5 0 0
6 0 5 0 3 0
1 5 0 5 6 4
5 0 5 0 0 2
0 3 6 0 0 6
0 0 4 2 6 0
*/

#include <stdio.h>
#include<string.h>
#define MAX_SIZE 100

int n ;
int closedge[MAX_SIZE];
int min_road(int a[]);

int main (){
int sum;
int i, j ;
int G[MAX_SIZE][MAX_SIZE];
scanf("%d",&n);
for (i = 0 ; i < n ; i ++)
for ( j = 0 ; j < n ; j++){
scanf("%d",&G[i][j]);
if (G[i][j]==0)
G[i][j]=0x7fffffff;
}
sum = MinSpanTree_prim(G , 0);
printf("总花费 = %d\n",sum);
return 0;
}

int MinSpanTree_prim(int G[][MAX_SIZE] ,int v){

int i,j;
int sum = 0 ;//总花费
int new_point ;//新节点
for ( i = 0 ; i < n ; i ++){
closedge[i] = G[v][i];
}
closedge[v] = 0;
printf("%d\n",v);
for (i = 1 ; i < n ; i++){
new_point = min_road(closedge);//从数组中找出最小的非零边,没有返回-1
printf("%d\n",new_point);
if (new_point^-1){

sum += closedge[new_point] ;
closedge[new_point] = 0 ;//加入生成树
}else{
printf("图不连通\n");
}
for ( j = 0 ; j < n ; j ++){
if (closedge[j] && G[new_point][j]){
closedge[j] = G[new_point][j]<closedge[j]?G[new_point][j]:closedge[j];
}
// printf(" %d ",closedge[j]);
}
printf("\n");
}
return sum;

}
int min_road(int a[]){

int min = 0x7fffffff ;
int v = -1 , i ;
for ( i = 0 ; i< n ; i++){
if (closedge[i] && closedge[i]<min){
min = closedge[i] ;
v = i ;
}
}
return v;

}

最短路径算法代码:

//最段路径
/*
6
0 6 1 5 0 0
6 0 5 0 3 0
1 5 0 5 6 4
5 0 5 0 0 2
0 3 6 0 0 6
0 0 4 2 6 0
*/

#include <stdio.h>
#include<string.h>
#define MAX_SIZE 100

int n ;
int closedge[MAX_SIZE];//记录各点到源点的距离
int visited[MAX_SIZE] ;//记录该点是否已经加入集合V
int min_road(int a[]);

int main (){
int sum;
int i, j ;
int G[MAX_SIZE][MAX_SIZE];
scanf("%d",&n);
for (i = 0 ; i < n ; i ++)
for ( j = 0 ; j < n ; j++){
scanf("%d",&G[i][j]);
if (G[i][j]==0)
G[i][j]=0x7fffffff;
}
MinSpanTree_prim(G , 0);
return 0;
}

int MinSpanTree_prim(int G[][MAX_SIZE] ,int v){

int i,j;
//int sum = 0 ;//总花费
int new_point ;//新节点
for ( i = 0 ; i < n ; i ++){
visited[i] = 0;
closedge[i] = G[v][i];
}
closedge[v] = 0;
visited[v] = 1;
// printf("%d\n",v);
for (i = 1 ; i < n ; i++){
new_point = min_road(closedge);//从数组中找出最小的非零边,没有返回-1
// printf("%d\n",new_point);
if (new_point^-1){
visited[new_point] = 1;//加入集合U
// sum += closedge[new_point] ;
//closedge[new_point] = 0 ;//加入生成
}else{
printf("图不连通\n");
}
for ( j = 0 ; j < n ; j ++){
if ( !visited[j] && G[new_point][j]!=0x7fffffff){
closedge[j] = (G[new_point][j] + closedge[new_point])<closedge[j]?(G[new_point][j] + closedge[new_point]):closedge[j];//更新集合V中的最短路径
}
printf(" %d ",closedge[j]);
}
printf("\n");
}
// return sum;

}
int min_road(int a[]){

int min = 0x7fffffff ;
int v = -1 , i ;
for ( i = 0 ; i< n ; i++){
if (!visited[i] && closedge[i]<min){
min = closedge[i] ;
v = i ;
}
}
return v;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息