[codeforces#438 E题]Policeman and a Tree

基于边的树形DP+DP转移一个神奇的二分。

二分要从罪犯的角度去理解,之前一直在纠结一个警察和罪犯的极大极小博弈,没想到可以有这么一个神奇的二分。

写完AC,但感觉理解得不够深刻。

#include
#include
#include
#include
using namespace std;
#define INF 0x7f000000
#define N 55
struct EDGE{
  int u,v,w;
  EDGE(int u=0,int v=0,int w=0):u(u),v(v),w(w){}
};
vector e;
vector g[N];
int f[N*2][N][N];
int n,m;
int ccnt[N];
bool isleaf[N];
int st;
void read(){
  scanf("%d",&n);
  for (int i=1;is2)
                sum=s2;
            else
               sum+=b-1;
            if (sum>=s2) break;
     }
     if (sum>=s2) //存在一种方案使得警察无法在T时间内抓到所有人
        l=T+1;
     else
        r=T;
  }
  fval=w+l;
  return fval;
}
int main(){
  read();
  dfs(st,0);
  memset(f,127,sizeof(f));
  int ans=INF;
  for (int i=0;i


你可能感兴趣的:(ACM模板)