道路重建 洛谷P3905

2021-09-24 22:25:07 字數 1014 閱讀 1540

題目描述

一場可怕的**後,人們用n個牲口棚(1≤n≤150,編號1…n)重建了農夫john的牧場。由於人們沒有時間建設多餘的道路,所以現在從乙個牲口棚到另乙個牲口棚的道路是惟一的。因此,牧場運輸系統可以被構建成一棵樹。john想要知道另一次**會造成多嚴重的破壞。有些道路一旦被毀壞,就會使一棵含有p(1≤p≤n)個牲口棚的子樹和剩餘的牲口棚分離,john想知道這些道路的最小數目。

輸入輸出格式

輸入格式:

第1行:2個整數,n和p

第2…n行:每行2個整數i和j,表示節點i是節點j的父節點。

輸出格式:

單獨一行,包含一旦被破壞將分離出恰含p個節點的子樹的道路的最小數目。

輸入輸出樣例

輸入樣例#1:62

3456

78910

11輸出樣例#1:

說明【樣例解釋】

如果道路1-4和1-5被破壞,含有節點(1,2,3,6,7,8)的子樹將被分離出來

思路

將完好的道路權值設為0,建圖然後跑一遍最短路

#includeusing namespace std;

int n,m,a,b,d;

int c[118][118];

bool xc[118][118];

int main()

scanf("%d",&d);

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

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

for(int j=1;jif(xc[i][j]) c[i][j]=c[j][i]=0;

scanf("%d%d",&a,&b);

for(int k=1;k<=n;k++)

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

for(int j=1;j<=n;j++)

if(c[i][k]+c[k][j]printf("%d\n",c[a][b]);

return 0;

}

洛谷P3905 道路重建

此題是顯然的最短路演算法,只是看到一起刪掉的一堆邊感到十分棘手,而且還要求出的是最短新增邊的總長度 但如果仔細觀察就可以發現,我們其實並不用乙個乙個的全部列舉,只需要把新增的邊做最短路就行了。我們可以首先把陣列初始化為乙個較大的數,然後每讀入一條邊,就把此邊的權值記錄,但還要把它清零。為什麼呢?因為...

洛谷P3905 道路重建

此題是顯然的最短路演算法,只是看到一起刪掉的一堆邊感到十分棘手,而且還要求出的是最短新增邊的總長度 但如果仔細觀察就可以發現,我們其實並不用乙個乙個的全部列舉,只需要把新增的邊做最短路就行了。我們可以首先把陣列初始化為乙個較大的數,然後每讀入一條邊,就把此邊的權值記錄,但還要把它清零。為什麼呢?因為...

P3905 道路重建

p3905 道路重建 我一開始想錯了,我的是類似kruskal,把毀壞的邊從小到大加,並且判斷聯通性。但是這有乙個問題,你可能會多加,就是這條邊沒用,但是它比較小,你也加上了。居然還有10分,資料也是水水的。include include include include include includ...