生活随笔
收集整理的這篇文章主要介紹了
牛客 吉吉王国
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
鏈接:https://ac.nowcoder.com/acm/problem/210473
來源:牛客網
吉吉王國有nn個城市,其中11號城市就是吉吉王國的首都,并且吉吉王國有n-1n?1條道路,每條道路都有一個長度dd,你可以從任意一點uu到達任意一點vv。但是最近吉吉王國發生了動亂,除了首都外,每個只有一條道路連向的城市出現了反叛軍。
這些城市的反叛軍開始向吉吉王國的首都發起了進攻,如果讓他們到達首都,那么吉吉國王就要換人了。吉吉國王現在需要快速切斷一些道路,使得沒有一個城市的反叛軍可以到達首都。但是由于物資的限制,他能切斷的道路的總長度和不能超過mm,并且要保證切斷道路盡量快,因此切斷的道路中最長的長度要盡可能小。
現在趕緊告訴吉吉國王切斷的道路的最長長度在最小的時候是多少吧。
輸入描述:
第一行兩個整數n, mn,m。
接下來n-1n?1行每行三個整數u, v,du,v,d表示城市uu和城市vv有一條長度為dd的道路。
輸出描述:
如果存在方案使得首都安全,輸出最小的最長長度,否則輸出-1。
思路:
和loves rinne很像,可以說是加強版
思路是因為有總長m和最長值最小的限制,因此可以使用二分答案,
二分最長值,用總長限制m來檢驗是否符合要求
#include<bits/stdc++.h>
using namespace std
;
#define N 1010const int INF
=1e7+10;int n
,m
;
int e
[2*N
],ne
[2*N
],w
[N
*2],h
[N
],idx
=0;
int f
[N
]; void add(int a
,int b
,int c
){e
[idx
]=b
,w
[idx
]=c
,ne
[idx
]=h
[a
],h
[a
]=idx
++;
}void dfs(int u
,int pre
,int len
){bool is_leaf
=true;for(int i
=h
[u
];~i
;i
=ne
[i
]){int j
=e
[i
];if(j
==pre
) continue;dfs(j
,u
,len
);is_leaf
=false;f
[u
]+=min(f
[j
],w
[i
]>len
?INF
:w
[i
]);}if(is_leaf
) f
[u
]=INF
;;
}int main(){memset(h
,-1,sizeof h
);scanf("%d%d",&n
,&m
);for(int i
=1;i
<n
;i
++){int u
,v
,d
;scanf("%d%d%d",&u
,&v
,&d
);add(u
,v
,d
),add(v
,u
,d
);}int ans
=0;int l
=0,r
=1e7+10;while(l
<r
){int mid
=l
+r
>>1;memset(f
,0,sizeof f
);dfs(1,-1,mid
);if(f
[1]<=m
) r
=mid
,ans
=r
;else l
=mid
+1;}if(!ans
) puts("-1");else printf("%d\n",ans
);return 0;
}
總結
以上是生活随笔為你收集整理的牛客 吉吉王国的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。