Holiday's Accommodation HDU

来源:互联网 发布:数据库设计用什么软件 编辑:程序博客网 时间:2024/06/11 21:56

题目描述:n个点n-1条带权无向边,现每个点都需离开自己的位置前往其他点的位置且两个点不能在同一位置,点移动时选择最短路径走,求所有点移动距离之和的最大值。

分析:n个点n-1条带权无向边且联通(否则孤立的点无法移动到其他点的)一看就是一棵树,故不能考虑图的最短路径的最大值问题,一开始我一直想歪了。队友一眼看出这是棵树,n最大为1e5,若以结点为出发点考虑,则必为O(n^2)的复杂度毫无疑问会超时,所以只能从边考虑。对于每个边,设其左边有x个结点,则其右边有n - x个结点,要想求最大距离值,则每条边被结点们经过的次数要尽可能大,最好的情况就是该边左边的结点全部到了右边或者右边的结点全部到了左边,则此时该边对应的最大值为value * min(x, n - x) * 2。

代码如下:

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<queue>#include<cstdlib>#include<sstream>#include<deque>#include<stack>#include<set>#include<map>using namespace std;typedef long long ll;typedef unsigned long long ull;const double eps = 1e-6;const int maxn = 1e5 + 10;const int mod = 10000007;const int dx[] = {1, -1, 0, 0, -1, -1, 1, 1};const int dy[] = {0, 0, -1, 1, -1, 1, -1, 1};const int Dis[] = {-1, 1, -5, 5};const double inf = 0x3f3f3f3f;struct node{    int v;    int dis;    node(int v = 0, int dis = 0) : v(v), dis(dis){}};int n, m;vector<node> g[maxn];int degree[maxn];int son[maxn];bool vis[maxn];ll ans;void dfs(int u){    int len = g[u].size();    int v, d;    for(int i = 0; i < len; ++i){        v = g[u][i].v;        d = g[u][i].dis;        if(vis[v]) continue;        vis[v] = true;        dfs(v);        son[u] += son[v];        ans += (ll)d * min(son[v], n-son[v]);//两边结点个数取小的得最多经过这条边的次数,再乘以这条边的权值。强转不然会超int。    }    ++son[u];//叶子结点的结点个数是它本身,即1。}int main(){    int t;    scanf("%d", &t);    int u, v, d;    int kase = 0;    while(t--){        memset(vis, false, sizeof vis);        memset(degree, 0, sizeof degree);        memset(son, 0, sizeof son);        for(int i = 0; i < maxn; ++i){            g[i].clear();        }        scanf("%d", &n);        for(int i = 1; i < n; ++i){            scanf("%d%d%d", &u, &v, &d);            g[u].push_back(node(v, d));            g[v].push_back(node(u, d));            ++degree[u], ++degree[v];        }        ans = 0;        dfs(1);        printf("Case #%d: %I64d\n", ++kase, ans*2LL);    }    return 0;}


原创粉丝点击