#include
using namespace std;
#define MaxSize 100
#define INF 9999
class MGraph
{
public:
void CreatMGraph(MGraph &);
void ppath(int path[][100],int i,int j);
void DisPath(int dist[][100],int path[][100],int n);
void Floyd(MGraph G);
void print(MGraph G);
private:
int edge[MaxSize][MaxSize];
char vertex[MaxSize];
int n,e;
};
void MGraph::ppath(int path[][MaxSize],int i,int j)
{
int k;
k=path[i][j];
if (k==-1) return;
ppath(path,i,k);
printf("%d,",k);
ppath(path,k,j);
}
void MGraph::DisPath(int dist[][MaxSize],int path[][MaxSize],int n)
{
int i,j;
for(i=0;i {
for(j=0;j {
cout cin>>i>>j;
if (dist[i][j]!=INF && i!=j)
{
printf(" 从%d到%d路径为:",i,j);
printf("%d,",i);
ppath(path,i,j);
printf("%d",j);
printf("\t最短路径长度为:%d\n",dist[i][j]);
}
}
}
}
void MGraph::Floyd(MGraph G)
{
int i,j,k,dist[MaxSize][MaxSize];
int n=G.n;
int path[MaxSize][MaxSize];
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
dist[i][j]=G.edge[i][j];
path[i][j]=-1;
}
for(k=0;k<n;k++)
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(dist[i][k]+dist[k][j]<dist[i][j])
{
dist[i][j]=dist[i][k]+dist[k][j];
path[i][j]=k;
}
DisPath(dist,path,n);
}
void MGraph::CreatMGraph(MGraph &G)
{
int i,j,k,w;
int kind;
int count=0;
cout<<"请输入顶点数和边数:";
cin >> G.n >> G.e;
cout<<"请输入边依附的顶点和权值:"< for(i=0;i {
for(int j=0; j {
G.edge[i][j] =INF;
if(i==j)
{
G.edge[i][j]=0;
}
}
}
for(int k=0; k {
cin >> i >> j >> w;
G.edge[i][j] = w;
if(kind==2)
G.edge[j][i]=w;
count++;
}
}
void MGraph::print(MGraph G)
{
cout << "图的邻接矩阵为:" << endl;
int i = 0; //打印行的标签
int j = 0; //打印列的标签
while (i!=G.n) {
j= 0;
while (j!=G.n) {
if (G.edge[i][j] ==INF)
cout << "∞" << " ";
else
cout << G.edge[i][j] << " ";
j++;
}
cout << endl;
i++;
}
}
int main()
{
cout << "输入图的种类:1代表有向图,2代表无向图" << endl;
int kind;
cin >> kind;
while (1) {
if (kind == 1 || kind == 2) {
break;
}
else {
cout << "输入的图的种类编号不合法,请重新输入:1代表有向图,2代表无向图" << endl;
cin >> kind;
}
}
MGraph g;
g.CreatMGraph(g);
g. print(g);
g.Floyd(g);
printf("\n");
return 0;
}