从前有棵树。
找出K个点A1,A2,…,Ak。
使得∑dis(AiAi+1),(1<=i<=K-1)最小。
标签:其他 using 不难 space put line har tput tree
1 //minamoto 2 #include<iostream> 3 #include<cstdio> 4 #include<cstring> 5 using namespace std; 6 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++) 7 char buf[1<<21],*p1=buf,*p2=buf; 8 template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;} 9 int read(){ 10 #define num ch-‘0‘ 11 char ch;bool flag=0;int res; 12 while(!isdigit(ch=getc())) 13 (ch==‘-‘)&&(flag=true); 14 for(res=num;isdigit(ch=getc());res=res*10+num); 15 (flag)&&(res=-res); 16 #undef num 17 return res; 18 } 19 const int N=3005; 20 int head[N],Next[N<<1],ver[N<<1],edge[N<<1],tot; 21 inline void add(int u,int v,int e){ 22 ver[++tot]=v,Next[tot]=head[u],head[u]=tot,edge[tot]=e; 23 } 24 int sz[N],f[N][N][3],n,m,ans=1<<30; 25 void dfs(int u,int fa){ 26 sz[u]=1,f[u][0][0]=f[u][0][1]=0; 27 for(int i=head[u];i;i=Next[i]){ 28 int v=ver[i]; 29 if(v!=fa){ 30 dfs(v,u); 31 for(int j=sz[u]-1;~j;--j) 32 for(int k=sz[v]-1;~k;--k) 33 for(int l=2;~l;--l) 34 for(int m=l;~m;--m) 35 cmin(f[u][j+k+1][l],f[u][j][l-m]+f[v][k][m]+edge[i]*(2-(m==1))); 36 sz[u]+=sz[v]; 37 } 38 } 39 } 40 int main(){ 41 // freopen("testdata.in","r",stdin); 42 n=read(),m=read(); 43 for(int i=1,u,v,e;i<n;++i) 44 u=read(),v=read(),e=read(),add(u,v,e),add(v,u,e); 45 memset(f,0x3f,sizeof(f));dfs(1,0); 46 for(int i=1;i<=n;++i) for(int j=0;j<=2;++j) cmin(ans,f[i][m-1][j]); 47 printf("%d\n",ans); 48 return 0; 49 }
标签:其他 using 不难 space put line har tput tree
原文地址:https://www.cnblogs.com/bztMinamoto/p/9831496.html