1875 暢通工程再續

2021-07-23 10:31:48 字數 1349 閱讀 4370

(

//零基礎學演算法135 

#include

using

namespace

std;

#include

const

double inf=0x3f3f3f3f*1.0;

struct node

;double d[105][105];

int c;//島嶼個數

void prim()

; int count=1;

for(int i=0;i//lowcost陣列儲存的是集合u中的點到v-u中每個結點的最近距離。

lowcost[i] = d[0][i];//二維陣列d,儲存著所有島兩兩的距離

//一開始的時候,集合u中只有結點0,所以lowcost陣列儲存的都是結點0到每個結點的距離

}for(int i=1;idouble min = inf;//inf是自定義常量,表無窮大,實際不可能為無窮大

int k = 105;//初始化為105,因為實際不可能為105

for(int j=0;jif(min>lowcost[j]&&lowcost[j])

//這裡也比較好理解,就是在不停的更新最短邊的長度及最短邊的另一端結點名。

//注意lowcost[j]==0時,表示結點j已經加入集合u了。所以把這條邊的長度lowcost[k]加入到總和sum中

sum+=lowcost[k];

lowcost[k]=0;

count++;

//同時標記該點k已經加入集合u,即lowcost[k]=0。count用於記錄已加入集合u中的點的個數。

for(int j=0;jif(d[j][k]//因為集合u中的點可能已經增加了,所以集合u中的點到v-u的點的最近距離也要再次更新。

lowcost[j] = d[j][k];//這個操作被稱為 「鬆弛操作」 。在圖論問題中有較多應用

}if(count==c)

printf("%.1lf\n",sum*100);

else

printf("oh!\n");

}int main()

x1=n[i].x, x2=n[j].x;

y1=n[i].y, y2=n[j].y;

double dist=sqrt(1.0*(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));

if(dist<10.0||dist>1000.0)

d[j][i]=d[i][j]=inf;

else

d[j][i]=d[i][j]=dist;}}

prim();

}return

0;}

hdu 1875 暢通工程再續

題目 又是最小生成樹。一開始錯了幾次。我以為是當兩段路大於1000或者小於10就會不符合要求。其實是讀錯題意了。當兩段路大於1000或者小於10。只應該把這段路變成死路。下面是ac include includeusing namespace std define n 9999999 int n d...

HDOJ 1875 暢通工程再續

這個暢通工程還是一交就過,看來暢通工程用來入門是最好了,以後拿這些來掛就不會那麼打擊人了,天天開心。這裡求最小生成樹之前要自己構圖,很簡單就是求出點到點之間的距離,如果距離大於1000和小於10都視作不連通。點少,還是prim就好了。不過這裡存在不連通的情況,不想前面的的工程那麼暢通,最後加乙個迴圈...

HDOJ 1875 暢通工程再續

題意 給出一百個點的座標,任意兩點之間都有邊,求將所有點連線起來的最短的所有邊長和 思路 最小生成樹模板,稠密圖,對邊的長度進行篩選即可 注意點 無 以下為ac run id submit time judge status pro.id exe.time exe.memory code len.l...