次小生成樹 配題(HDU 4081)

2021-09-29 11:23:42 字數 1162 閱讀 2260

次小生成樹:在最小生成樹(mst)的基礎上求得。

演算法步驟:

配題:hdu 4081

題意:無向圖,有 n 個點,每個點的座標和該點具有的人口數告訴你,秦始皇想將n個點連通起來,用最小的代價去鋪路(總里程數最小),有乙個巫師,可以將一條路的代價將為 0(巫師選中的這條路必須被建造)。求 一條路的乙個特殊比值

思想:

#include#include#include#include#include#include#include#define inf 0x7fffffff

using namespace std;

const int maxn = 1005;

struct point

point[maxn];

struct node

;vectorgraph[maxn];

int n;

double sum;

double dp[maxn][maxn];

bool used[maxn][maxn];

double cal_dis(point& p1, point& p2)

double max(double x, double y)

double prim(int source)

vis[source] = true;

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

}sum += mindis;

vis[pos] = true;

used[father[pos]][pos] = used[pos][father[pos]] = true;

for (int j = 0; j < graph[pos].size(); j++)

else}}

} return sum;

}int main()

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

}double mst_sum = prim(1);

double res = -1;

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

else

}} cout<< fixed<< setprecision(2);

cout<< res<< endl;

} return 0;

}

hdu 4081 次小生成樹

找到乙個生成樹,並且保證a b最大,所以b要盡量小,a盡量大。b盡量小,就要想到最小生成樹,但是最小生成樹裡面,可以刪除乙個邊,這樣就轉化為次小生成樹中找a b最大的情況。或者prim 並查集。include include include include include using namespa...

HDU 4081 次小生成樹變形

題意是有n個點,分別輸入n個點的座標和這個點的權值,然後要給這些點建邊,建邊的權值就是兩點間的距離,現在可以免費的建一條邊,求免費建邊的兩個點的權值和與總費用的最大值。思路就是模擬次小生成樹的思路,在刪邊的過程中維護所要求的最大值就好了。ac include define maxn 1005 def...

hdu 4081 最小生成樹

先求出最小生成樹,然後列舉樹上的邊,對於每條邊 分別 找出這條割邊形成的兩個塊中點權最大的兩個 1.由於結果是a b,a的變化會引起b的變化,兩個制約,無法直接貪心出最大的a b,故要通過列舉 2.不管magic road要加在 加的邊是否是最小生成樹上的邊,都會產生環,我們都要選擇一條邊刪掉 注意...