hdu 4081 最小生成樹

2021-06-09 23:00:09 字數 807 閱讀 3641

先求出最小生成樹,然後列舉樹上的邊,對於每條邊「分別」找出這條割邊形成的兩個塊中點權最大的兩個

1.由於結果是a/b,a的變化會引起b的變化,兩個制約,無法直接貪心出最大的a/b,故要通過列舉

2.不管magic road要加在**,加的邊是否是最小生成樹上的邊,都會產生環,我們都要選擇一條邊刪掉

注意刪掉的邊必須是樹的環上的邊,為了使結果最大,即找出最大的邊

3.可以列舉兩點,找出邊,也可以列舉邊,找出點,我是用後者,感覺比較容易寫也好理解

#include #include #include #include #include #include using namespace std;

#define n 1050

#define inf 1000000

struct point

p[n];

int n;

double map[n][n],dist[n],a,b;

vectorvec[n];

double getdistance(point aa,point bb)

int pre[n];

void prim()

dist[now]=-1.0;

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

if(dist[i]>0&&dist[i]ans)

ans=res;

}ans+=(1e-8);

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

} //system("pause");

return 0;

}

hdu 4081 最小生成樹變形

關於最小生成樹的等效邊,就是講兩個相同的集合連線在一起 先建立乙個任意最小生成樹,這條邊分開的兩個子樹的節點最大的乙個和為a,sum為最小生成樹的權值和,b為sum 當前邊的權值 不斷列舉最小生成樹中的邊找最優值即可。include include include include define n ...

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...