로곡 P4149 [IOI 2011] Race 포인트 치료 +dp

낙곡P4149 [IOI2011]Race

k . -1.시분치가 반드시 용납될 필요는 없다!!!중요한 얘기는 세 번!분명히 이 문제는 점분치이다.우리는 dpdp를 고려해서sumsum수 그룹 처리 경로의 길이가disdis인 두 점 사이의 최소 변수로 infinf가 존재하지 않는다면ans=min(ans,sum[k-dis[u]]+d[u])로 이동합니다.매번 solve s o l v e 어떤 점 이후 폭력적으로 처리하지 않은 점의sum[dis] s u m[d i s]를 inf i n f로 직접 할당한다.마지막으로 매번sum[0]sum[0]에 00을 부여하면 됩니다.
#include //Ithea Myse Valgulious
namespace chtholly{
typedef long long ll;
#define re0 register int
#define rec register char
#define rel register ll
#define gc getchar
#define pc putchar
#define p32 pc(' ')
#define pl puts("")
/*By Citrus*/
inline int read(){
  int x=0,f=1;char c=gc();
  for (;!isdigit(c);c=gc()) f^=c=='-';
  for (;isdigit(c);c=gc()) x=(x<<3)+(x<<1)+(c^'0');
  return f?x:-x;
  }
template <typename mitsuha>
inline bool read(mitsuha &x){
  x=0;int f=1;char c=gc();
  for (;!isdigit(c)&&~c;c=gc()) f^=c=='-';
  if (!~c) return 0;
  for (;isdigit(c);c=gc()) x=(x<<3)+(x<<1)+(c^'0');
  return x=f?x:-x,1;
  }
template <typename mitsuha>
inline int write(mitsuha x){
  if (!x) return 0&pc(48);
  if (x<0) x=-x,pc('-');
  int bit[20],i,p=0;
  for (;x;x/=10) bit[++p]=x%10;
  for (i=p;i;--i) pc(bit[i]+48);
  return 0;
  }
inline char fuhao(){
  char c=gc();
  for (;isspace(c);c=gc());
  return c;
  }
}using namespace chtholly;
using namespace std;
#define int ll
const int yuzu=2e6,mulu=1e7,inf=0x3f3f3f3f;
typedef int fuko[yuzu|10];
struct edge{int to,cost;};
vector lj[yuzu|10];
fuko sz,mxs,vis,d,dis;
int n,k,rt,nsz,xiao,ans=inf,sum[mulu|10];
/*         10 .*/
void grt(int u,int fa){
sz[u]=1,mxs[u]=0;
for (edge i:lj[u]){
  int v=i.to,c=i.cost;
  if (!vis[v]&&v^fa){
    grt(v,u),sz[u]+=sz[v];
    mxs[u]=max(mxs[u],sz[v]);
    }
  }
mxs[u]=max(mxs[u],nsz-mxs[u]);
if (mxs[u]void gdp(int u,int fa,int dep,int dist){
d[u]=dep,dis[u]=dist;
if (dis[u]>k) return;//         RE.
ans=min(ans,sum[k-dis[u]]+d[u]);
for (edge i:lj[u]){
  int v=i.to,c=i.cost;
  if (v^fa&&!vis[v]) gdp(v,u,dep+1,dist+c);
  }
}

void dfs(int u,int fa,bool nico){
sum[dis[u]]=nico?min(sum[dis[u]],d[u]):inf;
for (edge i:lj[u]){
  int v=i.to;
  if (!vis[v]&&v^fa) dfs(v,u,nico);
  }
}

#define init(x) rt=0,nsz=x,xiao=inf
void solve(int u){
vis[u]=1,sum[0]=0;
for (edge i:lj[u]){
  int v=i.to;
  if (!vis[v]){
    gdp(v,0,1,i.cost);//get        u v    .
    dfs(v,0,true);
    }
  }
for (edge i:lj[u]){
  int v=i.to;
  if (!vis[v]) dfs(v,0,false);
  }
for (edge i:lj[u]){
  int v=i.to,c=i.cost;
  if (!vis[v]){
    init(sz[v]),grt(v,0);
    solve(rt);
    }
  }
}

main(){
int i,j;n=read(),k=read();
for (i=1;iint u=read()+1,v=read()+1,c=read();//    0    .
  lj[u].push_back(edge{v,c});
  lj[v].push_back(edge{u,c});
  }
fill(sum+1,sum+mulu+1,inf);
init(n),grt(1,0),solve(rt);
write(ans^inf?ans:-1);
}
/*
4 3
0 1 1
1 2 2
1 3 4
*/

좋은 웹페이지 즐겨찾기