#include<iostream>
using namespace std;
#include<stdio.h>
#define maxint 999
typedef int* pointer;
template<class Type>
void Dijkstra(int n,int v,Type *dist,int *prev,Type **c){
//v是源点,dist记录源点到每一个顶点的最短距离,prev记录前一个顶点
//c是边距离矩阵
bool *s = new bool[n+1];
for(int i = 1;i <= n;i++){
dist[i] = c[v][i];
s[i] = false;
if(dist[i] == maxint)
prev[i] = 0;
else prev[i] = v;
}
dist[v] = 0;
s[v] = true;
for( i = 1;i < n;i++){
int temp = maxint;
int u = v;
for(int j = 1;j <= n;j++)
if((!s[j]) && (dist[j] < temp)){
u = j;
temp = dist[j];
}
s[u] = true;
for(j = 1;j <= n;j++)
if((!s[j]) && (c[u][j] < maxint))
{
Type newdist = dist[u] + c[u][j];
if(newdist < dist[j]){
dist[j] = newdist;
prev[j] = u;
}
}
}
delete []s;
}
// 查找从源点v到终点u的路径,并输出
void Path(int *prev,int v,int u){
//u为当前节点,v是源点
if(u == v){
return;}
Path(prev,v,prev[u]);
cout<<prev[u]<<" ";
}
int FileRead(char * filepath,int ** &ReturnArray){
if(!filepath){
cout<<"文件打不开!";
return 0;
}
FILE *fp = fopen(filepath,"r");
if(fp == NULL){
cout<<"文件不存在!\n";
exit(-1);
}
int ArrayNum = 0;
fscanf(fp,"%d\n",&ArrayNum);
ReturnArray = (int **)malloc((ArrayNum+1) * sizeof(int*));
if( ArrayNum > 0 )
{
for(int i = 1;i <= ArrayNum;i++)
ReturnArray[i] = (int *)malloc((ArrayNum+1) * sizeof(int));
}
for(int i = 1;i <= ArrayNum;i++)
for(int j = 1;j <= ArrayNum;j++){
if(j == ArrayNum) // 假如读到每行最后一个数字
fscanf(fp,"%d\n",&ReturnArray[i][j]);
else
fscanf(fp,"%d ",&ReturnArray[i][j]);
}
fclose(fp);
return ArrayNum;
}
void main(){
int **c = 0;
int n = FileRead("jxx.txt",c);
int v;//源点
int *prev = (int*)malloc((n+1) * sizeof(int));
int *dist = (int*)malloc((n+1) * sizeof(int));
cout<<"输入源点:";
cin>>v;
Dijkstra(n,v,dist,prev,c);
for(int i = 1;i <= n;i ++){
cout<<"\n点"<<v<<"到"<<"点"<<i<<"的距离为:";
Path(prev,v,i);
cout<<i<<" 距离是"<<dist[i]<<endl;
}
delete []prev;
delete []dist;
delete []c;
}
单源最短路径(贪心算法)
最新推荐文章于 2023-10-11 12:30:00 发布