bzoj2180 最小直徑生成樹

2022-08-22 21:33:14 字數 879 閱讀 5152

傳送門:

思路:先列舉圖的絕對中心在哪條邊(u,v)上,絕對中心就是到最遠點的距離最近的點,可以在邊上

設絕對中心到該邊乙個端點的距離為x

然後每個圖中的s點到它的距離就會是關於x的函式 即min(dis[u][s]+x,dis[v][s]+l-x)

這是一條折線,那麼每個點到它的距離都會是一條折線

那麼,我們就要使兩個距離最大點的取值最小

就是所有折線的最上面構成的折線的最下面的點

說的有些複雜,可以看這個部落格

按d[u][i]從大到小排序一遍掃瞄即可

#include#include#include#includeconst int maxn=205,maxm=50010;

using namespace std;

int n,m,d[maxn][maxn],inf,tot,rank[maxn][maxn],ans=(int)1e9;

struct edgee[maxm];

void floyd()

void work(int id)

}int main(){

scanf("%d%d",&n,&m),memset(d,63,sizeof(d)),inf=d[0][0];

for (int i=1;i<=n;i++) d[i][i]=0;

for (int i=1,x,y,z;i<=m;i++) scanf("%d%d%d",&x,&y,&z),d[x][y]=d[y][x]=min(d[x][y],z);

//for (int i=1;i<=n;i++,puts("")) for (int j=1;j<=n;j++) printf("%d ",d[i][j]);

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

bzoj 2561 最小生成樹

給定乙個邊帶正權的連通無向圖g v,e 其中n v m e n個點從1到n依次編號,給定三個正整數u,v,和l u v 假設現在加入一條邊權為l的邊 u,v 那麼需要刪掉最少多少條邊,才能夠使得這條邊既可能出現在最小生成樹上,也可能出現在最大生成樹上?第一行包含用空格隔開的兩個整數,分別為n和m 接...

bzoj2561 最小生成樹

time limit 10 sec memory limit 128 mb submit 1024 solved 520 submit status discuss 給定乙個邊帶正權的連通無向圖g v,e 其中n v m e n個點從1到n依次編號,給定三個正整數u,v,和l u v 假設現在加入一...

bzoj 2561 最小生成樹

給定乙個邊帶正權的連通無向圖,現在加入一條邊權為l的邊 u,v 那麼需要刪掉最少多少條邊,才能夠使得這條邊既可能出現在最小生成樹上,也可能出現在最大生成樹上?以前看著一臉懵逼,現在好像就是那樣。容易想到,當u v存在一條路徑,上面不存在 l的邊,那麼新邊一定不在最小生成樹上,所以將所有小於l的邊建出...