单源最短路径

来源:互联网 发布:网络兼职干什么好 编辑:程序博客网 时间:2024/06/05 09:26
#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;
}


原创粉丝点击