根據無向圖的邊鄰接矩陣求任意一點到其他所有點之間的最短路徑。


根據無向圖的邊鄰接矩陣求任意一點到其他所有點之間的最短路徑。

直接上代碼:

#include <iostream> 
#include <cmath>
using namespace std;
#define INFINITY 1000000000 //存儲無向圖中無邊兩點之間的距離
#define MAX 500 			//存儲該無向圖最多的點數為500
long arr[MAX][MAX]; 


void ShortestPath_DIJ(int n,int v0, int p[MAX][MAX], int D[MAX],long arr[MAX][MAX]) {  //計算v0到其他所有點之間的最短路徑。
    int v, w, i, j, min;
    bool final[MAX];
    for(v=0; v<n; v++) {
        final[v]=false;
        D[v]=arr[v0][v];
        for(w=0; w<n; w++)
            p[v][w]=-1;
        if(D[v]<INFINITY) {
            p[v][0]=v0;
            p[v][1]=v;
        }
    }
 
    D[v0]=0;
    final[v0]=true;
 
    for(i=1; i<n; i++) {
        min=INFINITY;
        for(w=0; w<n; w++)
            if(!final[w] && D[w]<min) {
                v=w;
                min=D[w];
            }
        final[v]=true;
        for(w=0; w<n; w++) {
            if(!final[w] && min<INFINITY && arr[v][w]<INFINITY
             && (min+arr[v][w]<D[w])) {
                D[w]=min+arr[v][w];
                for(j=0; j<n; j++) {
                    p[w][j]=p[v][j];
                    if(p[w][j]==-1) {
                        p[w][j]=w;
                        break;
                    }
                }
 
            }
        }
    }
    
    for(int i=0;i<n;i++)                             //輸出v0到其他所有點之間的最短路徑
    {
    	if(i!=v0)
    	{
    		cout<<v0<<"------>"<<i<<": "<<D[i]<<endl;	
		}
		else
		{
			continue;
		}
    	
	}
}

int main()
{
	
	int n,k;
	while(true)
	{
		cout<<"請輸入點數和邊數:"; 
		cin>>n>>k;
		for(int m=0;m<n;m++)
		{
			for(int r=0;r<n;r++)
			{
				if(m==r)
				{
					arr[m][r]=0;
				}
				else
				{
					arr[m][r]=INFINITY;	
				}

			}
		}
		cout<<"請輸入每條邊的鄰接點及所在邊的距離:"<<endl; 
		for(int m=0;m<k;m++)
		{
			int i,j,d;
			cin>>i>>j>>d;
			arr[i][j]=d;
			arr[j][i]=arr[i][j];
		}
		int p[MAX][MAX];
		int D[MAX];
		int v0;
		cout<<"請輸入起始點:";
		cin>>v0;
		cout<<v0<<"點到其他各個點之間的最短距離為:"<<endl ;
		ShortestPath_DIJ(n,v0,p,D,arr);
		
	}
	return 0;
}

  運行結果如下:

 

 

 

提示:如果想要求任意兩點之間的最短路徑,可以修改  ShortestPath_DIJ 函數的參數,增加一個目標點參數,在輸出時只輸出對應的最短距離即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM