日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[NOIP2007] 提高组 洛谷P1099 树网的核

發(fā)布時間:2025/6/15 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [NOIP2007] 提高组 洛谷P1099 树网的核 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?

題目描述

設T=(V, E, W) 是一個無圈且連通的無向圖(也稱為無根樹),每條邊到有正整數(shù)的權,我們稱T為樹網(wǎng)(treebetwork),其中V,E分別表示結點與邊的集合,W表示各邊長度的集合,并設T有n個結點。

路徑:樹網(wǎng)中任何兩結點a,b都存在唯一的一條簡單路徑,用d(a, b)表示以a, b為端點的路徑的長度,它是該路徑上各邊長度之和。我們稱d(a, b)為a, b兩結點間的距離。

  D(v, P)=min{d(v, u), u為路徑P上的結點}。

樹網(wǎng)的直徑:樹網(wǎng)中最長的路徑成為樹網(wǎng)的直徑。對于給定的樹網(wǎng)T,直徑不一定是唯一的,但可以證明:各直徑的中點(不一定恰好是某個結點,可能在某條邊的內部)是唯一的,我們稱該點為樹網(wǎng)的中心。

偏心距ECC(F):樹網(wǎng)T中距路徑F最遠的結點到路徑F的距離,即

ECC(F)=max{d(v, F),v∈V}

任務:對于給定的樹網(wǎng)T=(V, E, W)和非負整數(shù)s,求一個路徑F,他是某直徑上的一段路徑(該路徑兩端均為樹網(wǎng)中的結點),其長度不超過s(可以等于s),使偏心距ECC(F)最小。我們稱這個路徑為樹網(wǎng)T=(V, E, W)的核(Core)。必要時,F可以退化為某個結點。一般來說,在上述定義下,核不一定只有一個,但最小偏心距是唯一的。

下面的圖給出了樹網(wǎng)的一個實例。圖中,A-B與A-C是兩條直徑,長度均為20。點W是樹網(wǎng)的中心,EF邊的長度為5。如果指定s=11,則樹網(wǎng)的核為路徑DEFG(也可以取為路徑DEF),偏心距為8。如果指定s=0(或s=1、s=2),則樹網(wǎng)的核為結點F,偏心距為12。

輸入輸出格式

輸入格式:

?

輸入文件core.in包含n行:

第1行,兩個正整數(shù)n和s,中間用一個空格隔開。其中n為樹網(wǎng)結點的個數(shù),s為樹網(wǎng)的核的長度的上界。設結點編號以此為1,2,……,n。

從第2行到第n行,每行給出3個用空格隔開的正整數(shù),依次表示每一條邊的兩個端點編號和長度。例如,“2 4 7”表示連接結點2與4的邊的長度為7。

所給的數(shù)據(jù)都是爭取的,不必檢驗。

?

輸出格式:

?

輸出文件core.out只有一個非負整數(shù),為指定意義下的最小偏心距。

?

輸入輸出樣例

輸入樣例#1:
【輸入樣例1】 5 2 1 2 5 2 3 2 2 4 4 2 5 3 【輸入樣例2】 8 6 1 3 2 2 3 2 3 4 6 4 5 3 4 6 4 4 7 2 7 8 3 輸出樣例#1:
【輸出樣例1】 5 【輸出樣例2】 5

說明

40%的數(shù)據(jù)滿足:5<=n<=15

70%的數(shù)據(jù)滿足:5<=n<=80

100%的數(shù)據(jù)滿足:5<=n<=300,0<=s<=1000。邊長度為不超過1000的正整數(shù)

NOIP 2007 提高第四題

?

又是卡題面的題。

原題有張說明圖來著,然而好多OJ站上都沒放圖。

先floyd跑出最短路,然后根據(jù)最短路,O(n)掃描兩次找出樹直徑。因為數(shù)據(jù)比較小,所以可以枚舉所求直徑F的兩端點(只在已找出的直徑上選點),并記錄最小答案。

1 /*by SilverN*/ 2 #include<algorithm> 3 #include<iostream> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 #include<vector> 8 using namespace std; 9 const int mxn=1010; 10 int read(){ 11 int x=0,f=1;char ch=getchar(); 12 while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();} 13 while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();} 14 return x*f; 15 } 16 int mp[mxn][mxn]; 17 int n,s; 18 int hd,tl;//樹直徑端點 19 void init(){ 20 21 int i,j,k; 22 for(int k=1;k<=n;k++){ 23 for(i=1;i<=n;i++) 24 for(j=1;j<=n;j++){ 25 if(i==j)continue; 26 mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]); 27 } 28 } 29 for(i=1;i<=n;i++)mp[i][i]=0; 30 int mx=0; 31 for(i=1;i<=n;i++) 32 if(mp[1][i]>mx){ 33 mx=mp[1][i]; 34 hd=i; 35 } 36 mx=0; 37 for(i=1;i<=n;i++) 38 if(mp[hd][i]>mx){ 39 mx=mp[hd][i]; 40 tl=i; 41 } 42 return; 43 } 44 int node[mxn],cnt=0; 45 int main(){ 46 memset(mp,0x3f,sizeof mp); 47 int i,j; 48 n=read();s=read(); 49 int u,v,d; 50 for(i=1;i<n;i++){ 51 u=read();v=read();d=read(); 52 mp[u][v]=mp[v][u]=d; 53 } 54 init(); 55 for(i=1;i<=n;i++) 56 if(mp[hd][i]+mp[i][tl]==mp[hd][tl]) node[++cnt]=i; 57 int ans=1e9; 58 for(i=1;i<=cnt;i++) 59 for(j=1;j<=cnt;j++){ 60 if(mp[node[i]][node[j]]>s)continue; 61 int p1=1e9,p2=1e9; 62 p1=min(mp[hd][node[i]],mp[hd][node[j]]); 63 p2=min(mp[tl][node[j]],mp[tl][node[i]]); 64 // printf("i:%d j:%d mx:%d\n",i,j,max(p1,p2)); 65 ans=min(ans,max(p1,p2)); 66 } 67 printf("%d",ans); 68 return 0; 69 }

?

轉載于:https://www.cnblogs.com/SilverNebula/p/6016509.html

《新程序員》:云原生和全面數(shù)字化實踐50位技術專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的[NOIP2007] 提高组 洛谷P1099 树网的核的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。