哇,太長了。
顯然,樹的直徑不唯一但一定相交並且各個·直徑的中點匯聚於同一處。
進一步得到乙個推論,任意乙個直徑上求出的偏心距都相等。
原題中(n<=100)我們發現n的範圍有點小。直接上暴力。
floyed預處理一下。找到樹的直徑。
暴力列舉樹網的核再暴力列舉偏心距(至於具體怎麼列舉看**)
1 #include2 #include3 #include4 #include5 #include6view codeusing
namespace
std;
7int n,s,f[305][305],ans=999999999;8
intmain()
14for(int i=1,u,v,w;i<=n-1;i++)
18for(int x=1;x<=n;x++)
19for(int i=1;i<=n;i++)
20for(int j=1;j<=n;j++)
23int l,r,maxx=0;24
for(int i=1;i<=n;i++)
25for(int j=1;j<=n;j++)31}
32for(int i=1;i<=n;i++)
33for(int j=1;j<=n;j++)
39 ans=min(ans,tmp);40}
41}42 printf("%d"
,ans);
43return0;
44 }
但是當(n<=300000 sdoi2011消防)時以上的做法就gg了。需要考慮更優的方法。
考慮二分。(核越靠近中點答案越大)。對於我們二分的mid我們找到距離直徑的兩端距離大於等於mid的兩點p,q之間的路徑作為偏心距,判斷是否成立即可。
1 #include2 #include3 #include4view codeusing
namespace
std;
5#define n 30000567
intn,s,x,y,z,max,dmax,pt,inf,ans;
8int tot,point[n],nxt[n*2],v[n*2],c[n*2];9
inth[n],father[n],edge[n],leaf[n],c[n],len[n],goal[n],dis[n];
10bool
is[n];
1112
void add(int x,int y,int
z)13
16void dfs(int x,int fa,int
dep)
1723
bool flag=false;24
for (int i=point[x];i;i=nxt[i])
25if (v[i]!=fa)
2630
if (!flag) leaf[++leaf[0]]=x;31}
32void chain(int
x)33
40 c[++c[0]]=x;is[x]=true;41
}42void length(int x,int fa,int dep,int
st)43
49bool check(int
mid)
5062
else
break;63
for (int i=c[0];i>=1;--i)
64if (len[c[i]]>=edge[c[i-1
]])65
69else
break;70
int l=0,a=0,b=0;71
for (int i=1;i<=c[0];++i)
72if (len[c[i]]!=inf)
73for (int i=c[0];i>=1;--i)
74if (len[c[i]]!=inf)
75for (int i=a;iedge[c[i]];
76if (l<=s) return
true;77
else
return
false;78
}79intfind()
8088
return
ans;89}
90int
main()
9198 dfs(1,0,0
);99 leaf[0]=1,h[pt]=0,max=0,edge[pt]=0,dfs(pt,0,0
);100
chain(pt);
101 memset(len,127,sizeof(len));inf=len[0
];102
for (int i=1;i<=c[0];++i)
103 length(c[i],0,0
,c[i]);
104 ans=find();
105 printf("
%d\n
",ans);
106 }
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為端點...