題目描述
一場可怕的**後,人們用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...