151 USACO Dec07 建造路徑

2022-05-13 13:36:54 字數 2056 閱讀 2556

★★   輸入檔案:roads.in輸出檔案:roads.out簡單對比

時間限制:1 s  

記憶體限制:128 mb

譯 by cmykrgb123

描述farmer john 剛剛得到了幾個新農場!他想把這幾個農場用路連線起來,這樣他就可以通過筆直的公路從乙個農場到另乙個農場了。現在已經有了幾條連線著的農場。

n (1 ≤ n ≤ 1,000) 個農場中,每個農場的位置在座標平面的 (xi, yi) (0 ≤ xi ≤ 1,000,000; 0 ≤

yi ≤ 1,000,000)。已經有 m (1 ≤ m ≤ 1,000) 條路以前就被建好了。請你幫助 farmer john

考慮建設盡量少長度的額外的路,使他的農場連在一起。

輸入* 第 1 行: 兩個整數: n , m

* 第 2..n+1 行: 兩個整數 xi , yi

* 第 n+2..n+m+2 行: 兩個整數: i , j, 表示已經存在從農場i到農場j的路。

輸出* 第 1 行: 額外的路的最少長度,保留2小數。 請使用 64 位的浮點數。

樣例輸入

4 11 1

3 12 3

4 31 4

樣例輸出

4.00

好久沒寫最小生成樹了結果爆了一堆bug。。

對於已經建造的道路,我們可以把它的權值設定成0

然後跑裸地kruskal

注意記憶體限制!!!!!!!!!!!

1 #include2 #include3 #include4 #include5 #include6

#define inf 0x7ffff

7using

namespace

std;

8const

int maxn=1001;9

int vis[maxn][maxn];//

記錄兩個城市之間是否已經有道路相連

10double

dis[maxn][maxn];

11struct

node

12edge[1000001

];16

int f[maxn*3

];17

int num=1;18

struct

pos19

where[maxn*3

];22

intn,m;

23double ans=0;24

int read(int &n)

2528

while(c>='

0'&&c<='

9')x=x*10+(c-48),c=getchar();

29if(flag)n=-x;

30else n=x;31}

32void

deal_dis()

33*/

48//

cout<49}50

void add_edge(int p,int q,double

we)51

58int find(int

x)59

64int unionn(int x,int

y)65

70int comp(const node & a,const node &b)

7174

void

kruskal()

7586

if(k==n)

87break;88

}89 printf("

%.2lf

",ans);90}

91int

main()

92106

107deal_dis();

108109

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

110for(int j=1;j)

111if(i!=j&&vis[i][j]==0

)112

add_edge(i,j,dis[i][j]);

113114

kruskal();

115return0;

116 }

07 重建二叉樹

題目描述 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。示例 前序遍歷 preorder 3 9,20 15,7 中序遍歷 inorder 9 3,15 20,7 返回如下的二叉樹 3 920 157 definition for a ...

07 重建二叉樹

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如,給出 前序遍歷 preorder 3,9,20,15,7 中序遍歷 inorder 9,3,15,20,7 返回如下的二叉樹 3 9 20 15 7 限制 0 節點個數 5000 解 ...

07 重建二叉樹

利用python陣列的index函式來定位根節點在inorder陣列中的位置 index inorder.index root.val preorder陣列不需要進行切片操作,遞迴終止條件主要靠 前兩行中的not inorder來終止。root.left self.buildtree preorde...