#include<bits/stdc++.h>
using namespace std;
typedef struct Graph{
char a[10];
int juzhen[10][10];
int vex,edge;
}Graph;
int Locate(Graph &p,char a);
void CreatGraph(Graph &p);
void dayin(Graph &p);
void Dij(Graph &p,int v);
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;
for(a=0;a<p.vex;a++){
fscanf(fp,"%c ",&p.a[a]);//读取字符
}
/*for(int cc=0;cc<p.vex;cc++){
cout<<p.a[cc]<<" ";
}*/
for(int i=0;i<p.vex;i++){
for(int j=0;j<p.vex;j++){
p.juzhen[i][j]=1000000;//初始化,设为1000000
}
}
for(a=0;a<p.edge;a++){
char u,v;
int weight;
fscanf(fp,"%c %c %d ",&u,&v,&weight);//有向图
//cout<<u<<" "<<v<<" "<<weight<<endl;
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;
//cout<<p.juzhen[u1][v1]<<endl;
}
fclose(fp);
}
void Dij(Graph &p,int v){
int dine[100];
int path[100];
int final[100];
int a=p.vex;
int b;
for(b=0;b<a;b++){
dine[b]=p.juzhen[v][b];
final[b]=0;
if(dine[b]<1000000){//在这里最大值建议为1000000,使用INFINITY会超出int上线
path[b]=v;
}
else{
path[b]=-1;
}
}
final[v]=1;
for(b=1;b<a;b++){
int min=1000000;
int k=b;
for(int i=0;i<a;i++){
if(final[i]!=1&&dine[i]<min){
min=dine[i];
k=i;
}
}
final[k]=1;
for(int i=0;i<a;i++){
if(final[i]!=1&&dine[i]>dine[k]+p.juzhen[k][i]){
dine[i]=dine[k]+p.juzhen[k][i];
path[i]=k;
}
}
}
/*for(b=0;b<a;b++){
cout<<dine[b]<<" ";
}*/
printf("输出路径\n");
for(int i=0;i<a;i++){
if(i!=v){
int p1=path[i];
if(p1==-1){
printf("不存在最短路\n");
}
else{
int d2[100];
int m2=0;
d2[m2]=i;
m2++;
while(p1!=v){
d2[m2]=p1;
m2++;
p1=path[p1];
}
d2[m2]=v;
for(int j=m2;j>0;j--){
printf("%c->",p.a[d2[j]]);
}
printf("%c 长度为:%d",p.a[d2[0]],dine[i]);
printf("\n");
}
}
}
}
void dayin(Graph &p){
int a=p.vex;
for(int b=0;b<a;b++){
for(int c=0;c<a;c++){
//cout<<p.juzhen[b][c]<<endl;
printf("%d ",p.juzhen[b][c]);
}
printf("\n");
}
}
int main(){
Graph a;
CreatGraph(a);
int b;
cin>>b;//输入起点,开始进行dij
Dij(a,b);
//dayin(a);
return 0;
}
迪杰斯特拉使用邻接矩阵建立有向图求最短路
于 2023-12-07 21:56:07 首次发布