#include <cstdio>
#include <algorithm>
#define Max 100
#define Maxint 100000
typedef struct
{
int vex,arc;
int weight[Max][Max];
}Graph;
int Dist[Max][Max];
int Path[Max][Max];
void CreatGraph(Graph &G)
{
int vex,arc;
printf("顶点数:");
scanf("%d",&vex);
G.vex=vex;
printf("边数:");
scanf("%d",&arc);
G.arc=arc;
int i,j,weight;
for(i=0;i<vex;i++)
{
for(j=0;j<vex;j++)
{
if(i==j) G.weight[i][j]=0;
else G.weight[i][j]=Maxint;
}
}
int e1,e2;
for(i=0;i<arc;i++)
{
printf("第%d条边 顶点->权值->顶点:",i+1);
scanf("%d%d%d",&e1,&weight,&e2);
G.weight[e1][e2]=weight;
}
}
/*void Input(Graph G)
{
int i,j;
for(i=0;i<G.vex;i++)
{
for(j=0;j<G.vex;j++)
{
printf("%8d",G.weight[i][j]);
}
printf("\n");
}
}*/
void Floyd(Graph &G)
{
int i,j,k;
for(i=0;i<G.vex;i++)
{
for(j=0;j<G.vex;j++)
{
Dist[i][j]=G.weight[i][j];
if(i!=j&&Dist[i][j]<Maxint) Path[i][j]=i;
else Path[i][j]=-1;
}
}
for(k=0;k<G.vex;k++)
{
for(i=0;i<G.vex;i++)
{
for(j=0;j<G.vex;j++)
{
if(Dist[i][k]+Dist[k][j]<Dist[i][j])
{
Dist[i][j]=Dist[i][k]+Dist[k][j];
Path[i][j]=Path[k][j];
}
}
}
}
}
int main()
{
Graph G;
CreatGraph(G);
system("cls");
//Input(G);
int i,j;
Floyd(G);
for(i=0;i<G.vex;i++)
{
for(j=0;j<G.vex;j++)
{
if(Dist[i][j]<Maxint&&i!=j)
printf("Dist[%d][%d]=%3d ",i,j,Dist[i][j]);
}
printf("\n");
}
int vex1,vex2;
while(1)
{
printf("顶点一:");
scanf("%d",&vex1);
printf("顶点二:");
scanf("%d",&vex2);
if(vex1==-1&&vex2==-1) break;
if(Dist[vex1][vex2]==Maxint) printf("该两点无最短路径!\n");
else
{
if(vex1==vex2) printf("ERROR!\n");
else
{
int t=vex2;
printf("经过顶点:");
printf("%-3d",t);
while(Path[vex1][t]!=-1)
{
t=Path[vex1][t];
printf("%-3d",t);
}
printf("\n");
}
}
}
return 0;
}
最短路径 之 弗洛伊德算法 C、C++
最新推荐文章于 2024-04-12 22:29:57 发布