1. 程式人生 > >最短路徑弗洛伊德演算法C語言實現__Floyd

最短路徑弗洛伊德演算法C語言實現__Floyd

// 採用鄰接矩陣表示圖

// 簡單起見,鄰接矩陣(圖中各結點間的距離權值)在main函式中直接輸入了
#include <stdio.h>
#include <stdlib.h>

#define MAXVEX 9
#define INFINITY 65535

struct MGraph{
	int numVertexes;
	int *vex;
	int arc[MAXVEX][MAXVEX];
};

typedef int PathMatrix[MAXVEX][MAXVEX];
typedef int ShortPathTable[MAXVEX][MAXVEX];

void ShortestPath_Floyd(MGraph *G,PathMatrix *P,ShortPathTable *D)
{
	int v,w,k;
	//初始化
	for(v=0;v<G->numVertexes;++v)
	{
		for(w=0;w<G->numVertexes;++w)
		{
			(*D)[v][w]=G->arc[v][w];
			(*P)[v][w]=w;
		}
	}

	for(k=0;k<G->numVertexes;++k)
	{
		for(v=0;v<G->numVertexes;++v)
		{
			for(w=0;w<G->numVertexes;++w)
			{
				if( (*D)[v][w]>(*D)[v][k]+(*D)[k][w] )  // (v到w的距離) VS (v到k的距離+k到w的距離)
				{
					(*D)[v][w]=(*D)[v][k]+(*D)[k][w];
					(*P)[v][w]=(*P)[v][k]; //若從v出發,要去w,則先要從v去到k,“再作下一步打算(下一步即(*P)[k][w])”
				}
			}
		}
	}
}

void main()    
{    
    MGraph *my_g=(struct MGraph*)malloc(sizeof(struct MGraph));    
    int i,j;    
    int t=0;  
  
    int v0=0;  
    int vv=8;  
  
    my_g->numVertexes=MAXVEX;    
    my_g->vex=(int*)malloc(sizeof(char)*my_g->numVertexes);    
    if(!my_g->vex) return;    
    for(i=0;i<my_g->numVertexes;++i)  //一維陣列(圖中各結點)初始化{0,1,2,3,4,5,6,7,8}    
        my_g->vex[i]=i++;  
  
    for(i=0;i<my_g->numVertexes;++i)    
        for(j=0;j<my_g->numVertexes;++j)    
            my_g->arc[i][j]=INFINITY;  
  
    // 無向圖的權值二維陣列為對稱矩陣  
    my_g->arc[0][1]=1;  my_g->arc[0][2]=5;  
    my_g->arc[1][2]=3;  my_g->arc[1][3]=7;  my_g->arc[1][4]=5;    
    my_g->arc[2][4]=1;  my_g->arc[2][5]=7;  
    my_g->arc[3][4]=2;  my_g->arc[3][6]=3;  
    my_g->arc[4][5]=3;  my_g->arc[4][6]=6;  my_g->arc[4][7]=9;  
    my_g->arc[5][7]=5;  
    my_g->arc[6][7]=2;  my_g->arc[6][8]=7;  
    my_g->arc[7][8]=4;  
    for(i=0;i<my_g->numVertexes;++i)    
        for(j=0;j<=i;++j)    
        {    
            if(i==j)    
            {    
                my_g->arc[i][j]=0;    
                continue;    
            }    
            my_g->arc[i][j]=my_g->arc[j][i];    
        }    
    for(i=0;i<my_g->numVertexes;++i)  //二維陣列表示圖中各結點間連線邊的weight    
    {    
        for(j=0;j<my_g->numVertexes;++j)    
            printf("%5d  ",my_g->arc[i][j]);    
        printf("\n");    
    }    
    printf("\n\n");

	PathMatrix D;
    ShortPathTable P;
	ShortestPath_Floyd(my_g,&P,&D);
	for(i=0;i<MAXVEX;++i)  //二維陣列表示圖中各結點間連線邊的weight    
    {    
        for(j=0;j<MAXVEX;++j)    
            printf("%5d  ",P[i][j]);    
        printf("\n");    
    }    
    printf("\n\n");

	free(my_g->vex);
}