1. 程式人生 > >資料結構實驗34——求賦權圖中一個結點到所有結點的最短路徑的長度

資料結構實驗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;
    }