数据结构实验34——求赋权图中一个结点到所有结点的最短路径的长度

Description

给一个赋权图(无向图),求0号结点到其余所有结点的最短路径的长度。

Input

先输入一个小于等于100的正整数n,然后输入赋权图的邻接矩阵(10000表示无穷大,并且任意一条简单路径的长度都小于10000)

Output

按结点编号的顺序输出0号结点所有结点的最短路径的长度。

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

    9

  • #include<stdio.h>
    
    int n;
    int matr[30][30],ans[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]);
    		 }
    	 }
    }
    
    void search(){
    	int i, j, k, tmp[30][30], min, v;
    	bool final[30];
    	for(i = 0; i < n; i++){
    	    final[i] = false;
    		ans[i] = matr[0][i];
    		for(j = 0; j < n; j++){
    		     tmp[i][j] = -1;
    			 if(ans[i] < 10000){
    			     tmp[i][0] = 0;
    				 tmp[i][1] = i;
    			 }
    		}
    	}
    
    	ans[0] = 0;
    	final[0] = true;
    
    	for(i = 1; i < n; i++){
    		min = 10000;
    		for(j = 0; j <n ; j++){
    			if(!final[j] && ans[j]<min){
    			     v=j;
    				 min = ans[j];
    			}
    		}
    		final[v] = true;
    		for(j = 0; j < n; j++){
    			 if(!final[j] && min<10000 && matr[v][j]<10000&& (min+matr[v][j]<ans[j])) {
                    ans[j]=min+matr[v][j];
                    for(k = 0;  k < n; k++) {
                        tmp[j][k]=tmp[v][k];
                        if(tmp[j][k]==-1) {
                            tmp[j][k]=j;
    						break;
    					}
    				} 
    			 }
    	    }
        } 
    }
    
    void output(){
         int i;
    	 for(i = 0; i < n; i++){
    	      printf("%d\n",ans[i]);
    	 }
    }
    
    int main(){
        init();
    	search();
    	output();
    	return 0;
    }


猜你喜欢

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