★★ 輸入檔案: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...