#include<iostream>
#include<string>
using namespace std;
const int MaxSize=10;
const int Max=999999;
class MGraph
{
private:
string vertex[MaxSize];
int arc[MaxSize][MaxSize];
int arcNum,vertexNum;
public:
MGraph(char a[],int n,int e)
{
arcNum=e;
vertexNum=n;
for(int i=0;i<vertexNum;i++)
{
vertex[i]=a[i];
}
for(int i=0;i<vertexNum;i++)
{
for(int j=0;j<vertexNum;j++)
{
if(i==j)arc[i][j]=0;
else arc[i][j]=Max;
}
}
int i,j;
int weight;
for(int k=0;k<arcNum;k++)
{
cin>>i>>j>>weight;
arc[i][j]=weight;
}
}
friend void Floyd(MGraph G)
{
int dist[MaxSize][MaxSize];
string path[MaxSize][MaxSize];
for(int i=0;i<G.vertexNum;i++)
{
for(int j=0;j<G.vertexNum;j++)
{
dist[i][j]=G.arc[i][j];
if(dist[i][j]!=0&&dist[i][j]!=Max)path[i][j]=G.vertex[i]+G.vertex[j];
else path[i][j]="";
}
}
for(int k=0;k<G.vertexNum;k++)//vertexNum次变换,因为需要加入每一个顶点
{
for(int i=0;i<G.vertexNum;i++)//遍历i和j之间是否经过k
{
for(int j=0;j<G.vertexNum;j++)
{
if(dist[i][k]+dist[k][j]<dist[i][j])//算法的关键点。可以把很多种情况排除掉了
{
dist[i][j]=dist[i][k]+dist[k][j];
path[i][j]=path[i][k]+G.vertex[j];
}
}
}
}
//开始遍历求到其他点的距离之和最小的点
int sum,k,Min=999999;
for(int i=0;i<G.vertexNum;i++)
{
sum=0;
for(int j=0;j<G.vertexNum;j++)
{
sum=sum+dist[i][j];
}
if(sum<Min)
{
Min=sum;
k=i;
}
}
cout<<"应该建在:"<<G.vertex[k];
}
};
int main()
{
char T[]={"abcde"};
MGraph a(T,5,10);
Floyd(a);
return 0;
}
#include<string>
using namespace std;
const int MaxSize=10;
const int Max=999999;
class MGraph
{
private:
string vertex[MaxSize];
int arc[MaxSize][MaxSize];
int arcNum,vertexNum;
public:
MGraph(char a[],int n,int e)
{
arcNum=e;
vertexNum=n;
for(int i=0;i<vertexNum;i++)
{
vertex[i]=a[i];
}
for(int i=0;i<vertexNum;i++)
{
for(int j=0;j<vertexNum;j++)
{
if(i==j)arc[i][j]=0;
else arc[i][j]=Max;
}
}
int i,j;
int weight;
for(int k=0;k<arcNum;k++)
{
cin>>i>>j>>weight;
arc[i][j]=weight;
}
}
friend void Floyd(MGraph G)
{
int dist[MaxSize][MaxSize];
string path[MaxSize][MaxSize];
for(int i=0;i<G.vertexNum;i++)
{
for(int j=0;j<G.vertexNum;j++)
{
dist[i][j]=G.arc[i][j];
if(dist[i][j]!=0&&dist[i][j]!=Max)path[i][j]=G.vertex[i]+G.vertex[j];
else path[i][j]="";
}
}
for(int k=0;k<G.vertexNum;k++)//vertexNum次变换,因为需要加入每一个顶点
{
for(int i=0;i<G.vertexNum;i++)//遍历i和j之间是否经过k
{
for(int j=0;j<G.vertexNum;j++)
{
if(dist[i][k]+dist[k][j]<dist[i][j])//算法的关键点。可以把很多种情况排除掉了
{
dist[i][j]=dist[i][k]+dist[k][j];
path[i][j]=path[i][k]+G.vertex[j];
}
}
}
}
//开始遍历求到其他点的距离之和最小的点
int sum,k,Min=999999;
for(int i=0;i<G.vertexNum;i++)
{
sum=0;
for(int j=0;j<G.vertexNum;j++)
{
sum=sum+dist[i][j];
}
if(sum<Min)
{
Min=sum;
k=i;
}
}
cout<<"应该建在:"<<G.vertex[k];
}
};
int main()
{
char T[]={"abcde"};
MGraph a(T,5,10);
Floyd(a);
return 0;
}