#include<bits/stdc++.h>
using namespace std;
typedef struct Graph{
char a[100];
int juzhen[100][100];
int vex,edge;
}Graph;
int Locate(Graph &p,char a);
void CreatGraph(Graph &p);
void dayin(Graph &p);
int Locate(Graph &p,char a){
int b=p.vex;
int c;
for(c=0;c<b;c++){
if(p.a[c]==a){
return c;
}
}
return -1;
}
void CreatGraph(Graph &p){
FILE* fp;
fp=fopen("弗洛伊德使用邻接矩阵建立有向图求最短路.txt","r");
fscanf(fp,"%d %d ",&p.vex,&p.edge);
int a;
int b=p.vex;
for(a=0;a<b;a++){
fscanf(fp,"%c ",&p.a[a]);
}
int c;
for(a=0;a<b;a++){
for(c=0;c<b;c++){
p.juzhen[a][c]=1000000;
}
}
int d=p.edge;
for(a=0;a<d;a++){
char u,v;
int weight;
fscanf(fp,"%c %c %d ",&u,&v,&weight);
int u1=Locate(p,u);
if(u1==-1){
printf("Error\n");
return;
}
int v1=Locate(p,v);
if(v1==-1){
printf("Error\n");
return;
}
p.juzhen[u1][v1]=weight;
}
fclose(fp);
}
void dayin(Graph &p){
int a=p.vex;
for(int b=0;b<a;b++){
for(int c=0;c<a;c++){
printf("%d ",p.juzhen[b][c]);
}
printf("\n");
}
}
void Floy(Graph &p){
int dine[100][100];
int path[100][100];
int a=p.vex;
int b,c;
for(b=0;b<a;b++){
for(c=0;c<a;c++){
dine[b][c]=p.juzhen[b][c];
if(b!=c&&dine[b][c]<1000000){
path[b][c]=b;
}
else{
path[b][c]=-1;
}
}
}
for(int k=0;k<a;k++){
for(int i=0;i<a;i++){
for(int j=0;j<a;j++){
if(dine[i][j]>dine[i][k]+dine[k][j]){
dine[i][j]=dine[i][k]+dine[k][j];
path[i][j]=path[k][j];
}
}
}
}
for(b=0;b<a;b++){
for(c=0;c<a;c++){
if(b!=c){
printf("起点: %c,终点: %c:\n",p.a[b],p.a[c]);
int p1=path[b][c];
if(p1==-1){
printf("无路径\n");
}
else{
int b1[100];
int m=0;
b1[m]=c;
m++;
while(p1!=b){
b1[m]=p1;
m++;
p1=path[b][p1];
}
b1[m]=b;
for(int k=m;k>0;k--){
printf("%c->",p.a[b1[k]]);
}
printf("%c 长度为:%d\n",p.a[b1[0]],dine[b][c]);
}
}
}
}
}
int main(){
Graph p;
CreatGraph(p);
Floy(p);
//dayin(p);
return 0;
}
弗洛伊德使用邻接矩阵建立有向图求最短路
于 2023-12-07 22:03:36 首次发布