数据结构实验35——用迪杰斯特拉算法求赋权图中的最短路径

Description

用迪杰斯特拉算法求一点到其余所有结点的最短路径。

Input

先输入一个小于100的正整数n,然后输入图的邻接矩阵(10000表示无穷大,即两点之间没有边),最后输入两个0到n-1的整数表示两个点。

Output

先用迪杰斯特拉算法求给定的第一个点到其余所有结点的最短路径。
然后再输出给定的两个点之间的最短路径(按顺序输出最短路径上的每一个点,每个数据占一行)。

  • Sample Input 
    4
    0 2 10 10000
    2 0 7 3
    10 7 0 6
    10000 3 6 0
    0 2
  • Sample Output
    0
    1
    

    2

  • length[]:起始点到第i个点的距离;point[]:第i个点是否被用作新起始点扫描过;way[]:到达第i个点需经过点way[i].
  • #include<stdio.h>
    #include<stdlib.h>
    #define MAX 10000
    
    int n, x, y;
    int matr[30][30];
    bool point[30];
    int length[30], way[30];
    
    void init(){
        int i, j;
    	scanf("%d", &n);
    	for(i = 0; i < n; i++){
    		for(j = 0; j < n; j++){
    		    scanf("%d", &matr[i][j]);
    		}
    		point[i] = true;
    	}
    	scanf("%d%d", &x, &y);
    	for(i = 0; i < n; i++){
    	    length[i] = matr[x][i];
    		way[i] = x;
    	}
    }
    
    void search(){
    	int i,min,v, m = n - 1;
    	point[x] = false;
    	while(m--){
    		min = MAX;
    		for(i = 0; i < n; i++){//找出最短路径
    			if(point[i] && length[i] < min){
    			    min = length[i];
    				v = i;
    			}
    		}
    		for(i = 0; i < n; i++){
    			if(matr[v][i] + min < length[i] && point[i]){
    			     length[i] = matr[v][i] + min;
    				 way[i] = v;
    			}
    		}
    		point[v] = false;
    	}
    }
    
    void output(){
        int tmp, ans[30], i, k = 0;
    	tmp = y;
    	while(tmp != x){
    		ans[k++] = tmp;
    		tmp = way[tmp];
    	}
    	ans[k] = way[x];
    	for(i = k; i >= 0; i--){
    	     printf("%d\n",ans[i]);
    	}
    }
    
    int main(){
        init();
    	search();
    	output();
    }

猜你喜欢

转载自blog.csdn.net/chengchencheng/article/details/80451889