,因为他一定能去,而且目前他最没用。
否则的话,就找一个距离最短的目标点过去(当然也可能一个都过不去喽)。
【证明】设军队x的经过的目标点是a,且他到根后回不到x。设他去了目标点b,设到a的军队是y。
显然我们可以让y去b,他一定能去。
【代码】
#include
#include
#define INF 500000000000005ll #define N 50005 using namespace std; typedef long long LL; struct adj{int go,next,s;}a[N*2]; struct arr { int x;LL y; friend inline int operator < (const arr &A,const arr &B){return A.y
=0;i--) if (f[k][i]&&dis[k][i]<=T) T-=dis[k][i],k=f[k][i]; return k; } void find(int k) { if (can[k]==Num) return;int flag=0; for (int i=end[k];i;i=a[i].next) { int go=a[i].go;if (go==f[k][0]) continue; find(go);if (can[go]!=Num) return;flag=1; } if (flag) can[k]=Num; } inline int check(LL Time) { Num++;int P=0,Q=0;p[0].y=INF; for (int i=1;i<=m;i++) if (Time
Q) return 1; if (p[i].y
Q; } LL erfen(LL l,LL r) { if (l==r) return l; LL mid=(l+r)>>1ll; if (check(mid)) return erfen(l,mid); return erfen(mid+1,r); } int main() { scanf("%d",&n); for (i=1;i