hdu 4081 次小生成樹

2021-07-15 23:28:03 字數 1623 閱讀 1029

找到乙個生成樹,並且保證a/b最大,所以b要盡量小, a盡量大。

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

#include

#include

#include

#include

#include

using

namespace

std;

#define inf 0x3f3f3f3f

struct node

;struct nn

int fi(int a)

void un(int a,int b)

void work()

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

}int main()

return

0;}

#include 

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int inf=0x3f3f3f3f;

const

int maxn = 1000+100;

typedef

long

long ll;

int fa[maxn], head[maxn];

int en[maxn];

double length[maxn][maxn];

struct edge

edge(){}

}e[500000+10];

int cnt;

void add(int u, int v)

void init()

struct point

void union(int u, int v)

struct node

int main()

}sort(edge, edge+m);

double dis = 0;

for (int i=0; iint u = find(edge[i].u);

int v = find(edge[i].v);

if (u == v)

continue;

for (int j=head[u]; j!=-1; j=e[j].next)

}e[en[v]].next = head[u];

en[v] = en[u];

union(u, v);

dis += edge[i].d;

}double maxx = 0;

for (int i=0; idouble b = edge[i].pu/(dis-length[edge[i].u][edge[i].v]);

if (b > maxx)

maxx = b;

}printf("%.2lf\n", maxx);

}return

0;}

HDU 4081 次小生成樹變形

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

hdu 4081 最小生成樹

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

次小生成樹 配題(HDU 4081)

次小生成樹 在最小生成樹 mst 的基礎上求得。演算法步驟 配題 hdu 4081 題意 無向圖,有 n 個點,每個點的座標和該點具有的人口數告訴你,秦始皇想將n個點連通起來,用最小的代價去鋪路 總里程數最小 有乙個巫師,可以將一條路的代價將為 0 巫師選中的這條路必須被建造 求 一條路的乙個特殊比...