您的位置:首页 > 其它

图的中心点Floyd算法实现

2014-11-11 14:46 218 查看
#include <iostream>
using namespace std; 

#define MAX_V 100 //定义最大顶点个数
#define INF 10000 //表示正无穷 

typedef struct MGraph//图的定义
{
    //int matrix[MAX_V][MAX_V];//邻接矩阵,带权值可存权值如下 
    int weight[MAX_V][MAX_V];//存放权值矩阵 
    int v;//顶点数
	int e;//边数
    int vertax[MAX_V];//存放顶点信息
};//图的邻接矩阵类型

void CreateMGragh(MGraph *G)
{
	int i,j,m,weight;
	cout << "请输入顶点数和边数:" << endl;
	cin >> G->v >> G->e ;
	cout << "请输入顶点信息:" << endl;
	for (i=1;i<=G->v;i++)
	  scanf("%d",&G->vertax[i]);//输入顶点信息,建立顶点表
	
	for (i=1;i<=G->v;i++)//初始化权值矩阵 
	  for (j=1;j<=G->v;j++)
 	    G->weight[i][j]=INF;//让所有权值不存在 

    
	for(i=1;i<=G->v;i++)//是结点自身指向自身权值为0 
	  for(j=1;j<=G->v;j++)
	    if(i==j)
	      G->weight[i][j]=0;
	
	cout << "输入每条有向边的首尾顶点序号及权值:" << endl;
	for (m=0;m<G->e;m++)
	{
		cin >> i >> j >> weight;
		G->weight[i][j]=weight;
	}	
}

void DisplayMGragh_W(MGraph *G)//输出权值矩阵G
{
    int i,j;
    for(i=1;i<=G->v;i++)
    {
        for(j=1;j<=G->v;j++)
          printf("%8d",G->weight[i][j]);
        printf("\n");
    }
}

void DisplayArray(MGraph *G,int Shortest[MAX_V][MAX_V])//输出最短路径矩阵
{
    int i,j;
    for(i=1;i<=G->v;i++)
    {
        for(j=1;j<=G->v;j++)
          printf("%8d",Shortest[i][j]);
        printf("\n");
    }
}

void Floyd(MGraph *G,int Shortest[MAX_V][MAX_V])
{
    int i,j,k;
	for(i=1;i<=G->v;i++)
	  for(j=1;j<=G->v;j++)
	    Shortest[i][j]=G->weight[i][j];
    for(k=1;k<=G->v;k++)
      for(i=1;i<=G->v;i++)
        for(j=1;j<=G->v;j++)
          if(Shortest[i][k]+Shortest[k][j]<Shortest[i][j])
            Shortest[i][j]=Shortest[i][k]+Shortest[k][j];        
} 

void MaxArray(int MAX[MAX_V],int Shortest[MAX_V][MAX_V],int v)
{
	
	int i,j;
	for(i=1;i<=v;i++)
	{
	  for(j=1;j<=v;j++)
	  {
	      if((MAX[i]<Shortest[j][i])&&(Shortest[j][i]!=INF))
          MAX[i]=Shortest[j][i];
          if(Shortest[j][i]==INF)
          {
          	MAX[i]=INF;
          	break;
          }
	  }
	}
    for(i=1;i<=v;i++)
	  printf("%d ",MAX[i]);
    printf("\n");
}

void MinPath(int MAX[MAX_V],int v)
{
	int i;
	int min=INF,flag=0;
	for(i=1;i<=v;i++)
	  if(min>MAX[i])
	  {
          min = MAX[i];
          flag = i;
	  }
    cout << "中心点为:" << flag <<" "<<"最小偏心度为:" << min <<endl; 
}

int main()
{ 
    struct MGraph *G;
	G = new MGraph;
	int Shortest[MAX_V][MAX_V]; 
	int MAX[MAX_V];
	memset(MAX,0,MAX_V);
	
	int v,i,min;
	CreateMGragh(G);
	v=G->v;
	DisplayMGragh_W(G); 
	cout << endl;
	Floyd(G,Shortest);
	DisplayArray(G,Shortest); 
	
	MaxArray(MAX,Shortest,v);
	MinPath(MAX,v);
	
	delete G;
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: