zoukankan      html  css  js  c++  java
  • [BZOJ4987]Tree

    题目大意:

    给定一棵(n(nle3000))个点的带边权的树,找出(k)个点(A_{1sim k})使得(sum_{1le i<k} dis(A_i,A_i+1))最小。求最小值。

    思路:

    (k)个点一定是一个连通块,而且答案就是这个联通块边权和( imes 2-)直径。

    树形DP。(f[i][j][k])表示以(i)为根的子树,选了(j)个边,直径有(k)个端点已经确定。

    时间复杂度(mathcal O(n^2))

    源代码:

    #include<cstdio>
    #include<cctype>
    #include<vector>
    #include<cstring>
    #include<climits>
    inline int getint() {
    	register char ch;
    	while(!isdigit(ch=getchar()));
    	register int x=ch^'0';
    	while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
    	return x;
    }
    const int N=3001;
    struct Edge {
    	int to,w;
    };
    std::vector<Edge> e[N];
    inline void add_edge(const int &u,const int &v,const int &w) {
    	e[u].push_back((Edge){v,w});
    	e[v].push_back((Edge){u,w}); 
    }
    inline void upd(int &a,const int &b) {
    	a=std::min(a,b);
    }
    int size[N],f[N][N][3];
    void dfs(const int &x,const int &par) {
    	size[x]=1;
    	f[x][0][0]=f[x][0][1]=0;
    	for(unsigned i=0;i<e[x].size();i++) {
    		const int &y=e[x][i].to,&w=e[x][i].w;
    		if(y==par) continue;
    		dfs(y,x);
    		for(register int i=size[x]-1;i>=0;i--) {
    			for(register int j=size[y]-1;j>=0;j--) {
    				upd(f[x][i+j+1][0],f[x][i][0]+f[y][j][0]+w*2);
    				upd(f[x][i+j+1][1],f[x][i][0]+f[y][j][1]+w);
    				upd(f[x][i+j+1][1],f[x][i][1]+f[y][j][0]+w*2);
    				upd(f[x][i+j+1][2],f[x][i][0]+f[y][j][2]+w*2);
    				upd(f[x][i+j+1][2],f[x][i][1]+f[y][j][1]+w);
    				upd(f[x][i+j+1][2],f[x][i][2]+f[y][j][0]+w*2);
    			}
    		}
    		size[x]+=size[y];
    	}
    }
    int main() {
    	memset(f,0x3f,sizeof f);
    	const int n=getint(),k=getint();
    	for(register int i=1;i<n;i++) {
    		const int u=getint(),v=getint();
    		add_edge(u,v,getint());
    	}
    	dfs(1,0);
    	int ans=INT_MAX;
    	for(register int i=1;i<=n;i++) {
    		upd(ans,f[i][k-1][2]);
    	}
    	printf("%d
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    HTML和CSS之HTML(记录一2015.3.30)
    jquery学习记录三(表单选择器)
    jquery学习记录四(操作DOM元素)
    jquery学习记录二(过滤性选择器)
    jquery学习记录一(基础选择器)
    聚集索引和非聚集索引
    git命令
    4,gps信号与地图匹配算法
    3,gps定位原理及格式
    2,地图数据分析-地图数据转换成导航引擎数据
  • 原文地址:https://www.cnblogs.com/skylee03/p/9736357.html
Copyright © 2011-2022 走看看