有個引理是從任何一條直徑上求得的最小偏心距都相同
貪心的話,核肯定是越大越好的
然後我們在一條直徑上列舉長度不超過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為端點...