NOIP 2007 樹網的核

2022-05-19 21:31:30 字數 2541 閱讀 8753

哇,太長了。

顯然,樹的直徑不唯一但一定相交並且各個·直徑的中點匯聚於同一處。

進一步得到乙個推論,任意乙個直徑上求出的偏心距都相等。

原題中(n<=100)我們發現n的範圍有點小。直接上暴力。

floyed預處理一下。找到樹的直徑。

暴力列舉樹網的核再暴力列舉偏心距(至於具體怎麼列舉看**)

1 #include2 #include3 #include4 #include5 #include6

using

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 }

view code

但是當(n<=300000 sdoi2011消防)時以上的做法就gg了。需要考慮更優的方法。

考慮二分。(核越靠近中點答案越大)。對於我們二分的mid我們找到距離直徑的兩端距離大於等於mid的兩點p,q之間的路徑作為偏心距,判斷是否成立即可。

1 #include2 #include3 #include4

using

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 }

view code

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為端點...