XMU1344建食堂

http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1344


厦门大学在翔安也有了个新校区,新校区有n栋宿舍楼。由于地处偏僻,道路有限,只有n-1条路,每条路都是双向的,连接两栋宿舍楼,任意两栋楼都有且仅有一条路径互相到达。开发商想在校区内建一座食堂,食堂不能建在道路上,必须是在某栋宿舍楼。由于食堂实在很好吃,所有学生都会走路来这儿吃饭或买饭。为了便民,避免不必要的多走路,开发商希望食堂所在的宿舍楼到其他各个宿舍楼的距离之和最小,求这个最小值。


 经典问题。先建树,这里vector果然好用。g[i]保存点i所有子节点到i点的距离之和。s[i]保存以该点为根的树的节点数,然后

 f[x]=f[fa]+l[ln].l1*(n-2*s[x]);
DFS利用父节点得到的数据计算子节点的数据。
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;

#define M 1000000000
#define N 10005

struct line
{
    int a,b,l1;
}l[2*N];

vector p[N],p2[N];

int g[N],f[N],n,s[N];
bool tp[N];

int dfs1(int x)
{
    tp[x]=false;
    int ans=0;
    unsigned int i;
    bool h=false;

    for (i=0;i

你可能感兴趣的:(小OJ的比赛,vector,struct)