單源最短路徑----prim演算法
阿新 • • 發佈:2018-12-17
這一題是用二維陣列將點存入。
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~~