HDU1875 暢通工程再續 最小生成樹

2022-06-26 04:51:09 字數 1736 閱讀 2718

題意:

在這些小島中建設最小花費的橋,但是一座橋的距離必須在10 -- 1000之間。

思路:用最小生成樹解決吧,就那兩個演算法。

**:prim

#include #include 

#include

#include

using

namespace

std;

#define n 105

#define inf 0x3f3f3f3f

intn,i,j,x[n],y[n];

double

map[n][n];

bool vis[n];//

標記是否已經放入最小生成樹的那個集合裡了

double low[n];//

記錄不在已經加入最小生成樹的這個集合裡的元素到這個 集合的最小距離

double dis(int i,int

j)void

init()

}}void

prim()

vis[

1]=1

;

//已經找到乙個點1,再找n-1個

for(i=1;ii)

}if(min==inf)

sum+=min;

vis[pos]=1;//

把剛剛找到的這個點加入集合

for(j=1;j<=n;++j) //

更新low陣列}}

printf(

"%.1lf\n

",sum*100);}

intmain()

return0;

}

view code

kruskal

#include#include

#include

using

namespace

std;

struct

island

;struct

node

;island arr[

220];

node edge[

20000

];int per[220

];int

n;bool

cmp(node a,node b)

void

init()

}int find(int

x)bool join(int x,inty)

return0;

}int

main()

//m=n*(n-1)/2;

k=0;

for(i=1;i<=n;++i)//

把所有路記錄在node結構體中

}

sort(edge,edge+k,cmp);

double sum=0

;

for(i=0;ii)

}int cnt=0

;

bool flag=0

;

for(i=1;i<=n;++i)//

短路了就不會執行了,也就不會連線了,就只需要判斷根節點的個數

}if(flag) printf("

oh!\n");

else

printf(

"%.1lf\n

",sum*100

); }

return0;

}

view code

hdu 1875 暢通工程再續

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

HDU 1875 暢通工程再續

題目大意 其實就是求最小生成樹 不過唯一坑的地方在於只要求實現任意2個小島之間有路通即可,至少2個島連通 如果2個島不通才輸出oh 解題思路 標準的最小生成樹的模板 限制條件2島距離在10 1000公尺之間 普利姆演算法 include include include include include...

hdu1875 暢通工程再續

題目鏈結 此題是求最小生成樹的變形,需要從點和座標中抽象出邊的資訊,再利用kruskal求得最小生成樹,不過要注意邊是否符合要求,不然無法使用。看最後能否構成最小生成樹 include include include includeusing namespace std struct edge bu...