NOIP2007 樹網的核 模擬 貪心

2021-08-20 09:17:24 字數 1227 閱讀 2773

有個引理是從任何一條直徑上求得的最小偏心距都相同

貪心的話,核肯定是越大越好的

然後我們在一條直徑上列舉長度不超過s的一段路徑,作為核,求一下偏心距,最後求出最小值即可

注意,是路徑長度,長度!不是點的數量!

#include 

#include

#include

#include

#include

using

namespace

std;

#define debug(x) cerr << #x << "=" << x << endl;

const

int maxn = 1000 + 10;

const

int inf = 1

<<30;

int n,m,s,tot,last[maxn],pre[maxn],d[maxn],vis[maxn],lf,lt,max1,max2,ecc=inf;

int chain[maxn],sum,ch_vis[maxn],temp,maxx,ew[maxn],tes[maxn];

queue

q1, q2;

struct edge

edge(int u, int v, int w, int to) : u(u), v(v), w(w), to(to) {}

}e[maxn * 2];

inline

void add(int u, int v, int w)

void bfs1(int st)

q1.push(v);}}

}}void bfs2(int st)

q2.push(v);}}

}}void bfs(int st)

q1.push(v);}}

}}int main()

bfs1(1);

bfs2(lf);

while(lt)

if(s == 0)

printf("%d\n", ecc);

return

0; }

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

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

ecc = min(ecc, maxx);

if(!now)

}return

0;}

NOIP2007 樹網的核

參考了某位神牛的題解之後才發現原來這道題並不是很難 還是自己太弱了 原來的想法本來是快排找直徑,通過dfs確定在直徑中的點,然後再分別列舉每兩個點形成的邊,以邊的兩點做floyd通過打擂台確定偏心距。自己的想法真的很麻煩而且就算編出來少說也要200 行的 這在比賽中是不可能也是做不到的。正規且高效的...

NOIp 2007 樹網的核

問題描述 設 t v,e,w 是乙個無圈且連通的無向圖 也稱為無根樹 每條邊帶有正整數的權,我 們稱t 為樹網 treenetwork 其中v,e分別表示結點與邊的集合,w 表示各邊長度的集合,並設t 有n個結點。路徑 樹網中任何兩結點a,b 都存在唯一的一條簡單路徑,用d a,b 表示以a,b 為...

noip2007 樹網的核

樹網的核 題目描述 設t v,e,w 是乙個無圈且連通的無向圖 也稱為無根樹 每條邊到有正整數的權,我們稱t為樹網 treebetwork 其中v,e分別表示結點與邊的集合,w表示各邊長度的集合,並設t有n個結點。路徑 樹網中任何兩結點a,b都存在唯一的一條簡單路徑,用d a,b 表示以a,b為端點...