#include<stdio.h>
#include<iostream>
using namespace std;
#define maxint 1000
typedef int* pointer;
void Dijkstra(int n,int v,int *dist,int *prev,int **c){
bool *s = new bool[n+1];//顶点i是否属于集合s
for(int i = 1;i <= n;i++){//初始化部分
dist[i] = c[v][i];
s[i] = false;
if(dist[i] == maxint)
prev[i] = 0;//源点到顶点i没有直接的路
else
prev[i] = v;//源点到顶点i有直接的路
}
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)){
int 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是当前顶点
{
if(u == v){
return;
}
Path(prev,v,prev[u]);
printf("%d,",prev[u]);
}
int fileRead(char *filePath,int ** &rArray){
if(!filePath){
rArray = NULL;
printf("Cannot open file !");
return 0;
}
FILE * fp = fopen(filePath,"r");
if( fp == NULL){
printf("ERROR:File not exist\n");
exit(-1);
}
int arrayNum = 0;
fscanf(fp, "%d\n", &arrayNum);
rArray = new pointer[arrayNum+1];
if( arrayNum > 0 ){
for (int i = 0;i < arrayNum+1;i++ ) {
rArray[i] = new int[arrayNum + 1];
}
for (int j = 1; j <= arrayNum;j++ ) {
for (int x = 1; x <= arrayNum; x++ ) {
if ( x == arrayNum ) {/* 假如读到每行最后一个数字 */
fscanf(fp, "%d\n", &(rArray[j][x]));
}else
fscanf(fp, "%d ", &(rArray[j][x]));
}
}
}
fclose(fp);
return arrayNum;
}
void main()
{
int **c = 0;
int v;//源点
int n = fileRead("jxx.txt",c);
int *prev = new int[n + 1];
int *dist = new int[n + 1];
printf("输入源点:");
scanf("%d",&v);
Dijkstra(n,v,dist,prev,c);
for(int i = n;i > 0;i--){
printf("顶点%d到顶点%d的路径为:",v,i);
Path(prev,v,i);
printf("%d长度为%d\n",i,dist[i]);
}
delete prev;
delete dist;
delete []c;
}
#include<iostream>
using namespace std;
#define maxint 1000
typedef int* pointer;
void Dijkstra(int n,int v,int *dist,int *prev,int **c){
bool *s = new bool[n+1];//顶点i是否属于集合s
for(int i = 1;i <= n;i++){//初始化部分
dist[i] = c[v][i];
s[i] = false;
if(dist[i] == maxint)
prev[i] = 0;//源点到顶点i没有直接的路
else
prev[i] = v;//源点到顶点i有直接的路
}
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)){
int 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是当前顶点
{
if(u == v){
return;
}
Path(prev,v,prev[u]);
printf("%d,",prev[u]);
}
int fileRead(char *filePath,int ** &rArray){
if(!filePath){
rArray = NULL;
printf("Cannot open file !");
return 0;
}
FILE * fp = fopen(filePath,"r");
if( fp == NULL){
printf("ERROR:File not exist\n");
exit(-1);
}
int arrayNum = 0;
fscanf(fp, "%d\n", &arrayNum);
rArray = new pointer[arrayNum+1];
if( arrayNum > 0 ){
for (int i = 0;i < arrayNum+1;i++ ) {
rArray[i] = new int[arrayNum + 1];
}
for (int j = 1; j <= arrayNum;j++ ) {
for (int x = 1; x <= arrayNum; x++ ) {
if ( x == arrayNum ) {/* 假如读到每行最后一个数字 */
fscanf(fp, "%d\n", &(rArray[j][x]));
}else
fscanf(fp, "%d ", &(rArray[j][x]));
}
}
}
fclose(fp);
return arrayNum;
}
void main()
{
int **c = 0;
int v;//源点
int n = fileRead("jxx.txt",c);
int *prev = new int[n + 1];
int *dist = new int[n + 1];
printf("输入源点:");
scanf("%d",&v);
Dijkstra(n,v,dist,prev,c);
for(int i = n;i > 0;i--){
printf("顶点%d到顶点%d的路径为:",v,i);
Path(prev,v,i);
printf("%d长度为%d\n",i,dist[i]);
}
delete prev;
delete dist;
delete []c;
}