(
//零基礎學演算法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...