最小生成樹(蒟蒻)

2021-08-13 06:47:23 字數 1223 閱讀 9484

模板:修建道路

題面:

farmer john最近得到了一些新的農場,他想新修一些道路使得他的所有農場可以經過原有的或是新修的道路互達(也就是說,從任乙個農場都可以經過一些首尾相連道路到達剩下的所有農場)。有些農場之間原本就有道路相連。

所有n(1 <= n <= 1,000)個農場(用1..n順次編號)在地圖上都表示為座標為(x_i, y_i)的點(0 <= x_i <= 1,000,000;0 <= y_i <= 1,000,000),兩個農場間道路的長度自然就是代表它們的點之間的距離。現在farmer john也告訴了你農場間原有的m(1 <= m <= 1,000)條路分別連線了哪兩個農場,他希望你計算一下,為了使得所有農場連通,他所需建造道路的最小總長是多少。

輸入:

第1行: 2個用空格隔開的整數:n 和 m

第2..n+1行: 第i+1行為2個用空格隔開的整數:x_i、y_i

第n+2..n+m+2行: 每行用2個以空格隔開的整數i、j描述了一條已有的道路, 這條道路連線了農場i和農場j

輸出:

使所有農場連通所需建設道路的最小總長,保留2位小數,不必做任何額外的取整操作。為了避免精度誤差,計算農場間距離及答案時請使用64位實型變數(double)

includeusing

namespace

std;

const

int shuzu = 2100;

int n,m,x[shuzu],y[shuzu],a[shuzu][shuzu];

bool f[shuzu];//記錄某點是否在樹中

double ans,d[shuzu][shuzu],dis[shuzu];//dis為點到樹最短距離,d為各點間距離;

void init()

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

}for(int i = 1;i <= m;i++)

}void work()

f[1] = 1;

for(int i = 1;i <= n;i++)//各點和樹最短路徑

}for(int i = 2;i <= n;i++)//距離樹最近的點

f[p] = 1;//加入樹

w--;//如果所有點都加入了樹,退出

ans += dis[p];

//cout}

printf("%.2lf",ans);

}int main()

蒟蒻的線段樹

struct node ll a maxn node tr maxn 2 至於為什麼陣列要開4倍 能用就行 以及區間查詢 ll query int x,int l,int r interval sum if tr x tag 0 下推lazy tag 區間更新時使用 int mid tr x l t...

最小生成樹 次小生成樹

一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...

最小生成樹

package 圖 最小生成樹是用最少的邊吧把所有的節點連線起來。於是和圖的深度優先搜素差不多。class stack public void push int key public int pop 檢視棧頂的元素 public int peek public boolean isempty cla...