1. 程式人生 > >單源最短路徑----prim演算法

單源最短路徑----prim演算法

這一題是用二維陣列將點存入。

	scanf("%d%d%d",&x,&y,&z);
	if(a[x][y]!=0){
		a[x][y]=min(a[x][y],z);
	}
	else a[x][y]=z;

至於那個判斷則是判重邊啦。

先將每個點的權值賦最大(d陣列存點的值)。

const int inf=100000000;
......
for(i=1;i<=n;i++)d[i]=inf;

現在將d的s位,也就是出發編號至0。

d[s]=0;

接下來,定義一個最小值,之後迴圈,假如有一點的值比最小值要小而且該點未處理(p陣列為判斷該點是否處理,處理為1,否則為0。)

for(i=1;i<=n;i++){
		int zs=inf; //最小值至大值
	for(j=1;j<=n;j++){
		if(zs>d[j] && p[j]==0){//一點的值比最小值要小而且該點未處理
			zs=d[j]; //最小值更新
			k=j; //k記下座標
		}
	}

處理完了p[k]記得標記!

最後總判斷一遍。 若j點未判斷且邊值不為零(否則為孤島)且該點值比最小點值加邊值大,則更新資料。

for(j=1;j<=n;j++)
	{
		if(p[j]==0&&a[k][j]&&d[j]>d[k]+a[k][j])
			d[j]=d[k]+a[k][j];
	}

最後的輸出記得判可否到達。

 if(d[i]==inf)
		cout<<"2147483647 ";
	else printf("%d ",d[i]);
   

  因為這題是用圖的思想來做的,所以還是會有一個賊大賊大的點超時,TLE,QwQ,但也是一種思路。

Bye~~