我超,我居然写了好久呜呜呜,明明最后看到成品觉得其实很清晰啊……怪我写的时候没想好
#include <stdio.h>
int isFlag(int flag[],int n){
for(int i=0;i<n;i++){
if(flag[i]==0){
return 1;
//TODO
}
//TODO
}
return 0;
}
//递归回溯
void PrintPath(int firstPoint,int lastPoint,int lastStation[]){
if(lastPoint==firstPoint){
printf("%d",lastPoint+1);
return;
//TODO
}
PrintPath(firstPoint,lastStation[lastPoint],lastStation);
printf("%d",lastPoint+1);
}
int main(){
int n,m;
scanf("%d %d",&n,&m);
//初始化距离数组为INF
int distance[n][n];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
distance[i][j]=1000;
//TODO
}
//TODO
}
//输入距离
for(int i=0;i<m;i++){
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
distance[a-1][b-1]=c;
}
//标志是否被标记
int flag[n]={0};
flag[0]=1;
//标志到每个路径的最短距离
int sumDistance[n];
//先对第一个点计算邻接距离
for(int i=0;i<n;i++){
sumDistance[i]=distance[0][i];
if(sumDistance[i]==0){
sumDistance[i]=1000;
//TODO
}
//TODO
}
sumDistance[0]=1000;
//记录上一个点的数组
int lastStation[n]={0};
int i=0;
while(isFlag(flag,n)){//当没有被全部标记时
int j=0;
int min=sumDistance[0];
int minIndex=0;
for(j=0;j<n;j++){
if(flag[j]==1){//如果被标记则跳过是否更新的循环
continue;
//TODO
}
//如果距离小,则更新
if(distance[i][j]+sumDistance[i]<sumDistance[j]){
sumDistance[j]=distance[i][j]+sumDistance[i];
lastStation[j]=i;
//TODO
}
}
//找到最小距离
for(int t=0;t<n;t++){
if(sumDistance[t]<min&&flag[t]!=1){
min=sumDistance[t];
minIndex=t;
//TODO
}
//TODO
}
flag[minIndex]=1;
i=minIndex;
}
for(int i=0;i<n;i++){
printf("%d\t%d\t%d\t%d\n",i+1,flag[i],lastStation[i]+1,sumDistance[i]);
//TODO
}
int firstPoint,lastPoint;
scanf("%d %d",&firstPoint,&lastPoint);
PrintPath(firstPoint-1,lastPoint-1,lastStation);
return 0;
}