B. Connecting Universities DFS,无向树

http://codeforces.com/problemset/problem/700/B

题意是,在一颗树中,有k个大学,要求两两匹配,他们之间的距离作为贡献,使得距离总和最大。

一开始的时候无从下手,一路在想某一个点应该和哪一个点去匹配。但是这样是错误的思路。

正解是观察边的贡献,如果某两个学校连接了,那么肯定有一条路径的,这条路径会经过很多的边,我们把经过某条边的次数统计出来。那么答案就是这棵树的边的权值和。

那怎么算一条边的贡献呢。

贪心地去想,

某一条边,把整颗树分成了两部分,那么第一部分的学校肯定是连去第二部分的学校,这样的距离比较大。

那么就是有min(partI, k - partI)的贡献。dfs下去就好。脑洞好大。。不是我的题目

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <assert.h>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL;


#include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <bitset>
const int maxn = 200000 + 20;
bool is[maxn];
struct Edge {
    int u, v, tonext;
}e[maxn * 2];
int num, first[maxn];
void add(int u, int v) {
    ++num;
    e[num].u = u, e[num].v = v, e[num].tonext = first[u];
    first[u] = num;
}
LL ans, son[maxn];
int n, k;
void dfs(int cur, int fa) {
    son[cur] = is[cur];
    for (int i = first[cur]; i; i = e[i].tonext) {
        int v = e[i].v;
        if (v == fa) continue;
        dfs(v, cur);
        ans += min(k - son[v], son[v]);
        son[cur] += son[v];
    }
}
void work() {
    cin >> n >> k;
    k <<= 1;
    for (int i = 1; i <= k; ++i) {
        int x;
        cin >> x;
        is[x] = true;
    }
    for (int i = 1; i <= n - 1; ++i) {
        int u, v;
        cin >> u >> v;
        add(u, v);
        add(v, u);
    }
    dfs(1, 0);
    cout << ans << endl;
}

int main() {
#ifdef local
    freopen("data.txt", "r", stdin);
//    freopen("data.txt", "w", stdout);
#endif
    work();
    return 0;
}
View Code

 

转载于:https://www.cnblogs.com/liuweimingcprogram/p/6507540.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
如果您在尝试连接到 'sz.unidairy.net' 的 SSH 服务器时遇到 "Connection failed" 错误,并且无法连接到端口 22,可能有以下几种解决方法: 1. 确认服务器地址和端口:请确保 'sz.unidairy.net' 的地址和端口号 22 是正确的,没有输入错误。确保没有拼写错误或其他输入错误。 2. 检查网络连接:确保您的网络连接正常。尝试连接其他网站或服务,确认您的网络连接没有问题。 3. 防火墙和路由器设置:检查您的防火墙、路由器或其他网络设备上是否有任何设置阻止 SSH 连接。尝试暂时禁用防火墙或其他网络设备上的阻止规则,然后再次尝试连接。 4. IP 地址被阻止:确认您的 IP 地址没有被服务器的安全规则或防火墙所阻止。如果您是动态 IP 地址,请检查是否有任何限制在您的 IP 地址上。 5. SSH 服务器配置:检查 'sz.unidairy.net' 上的 SSH 服务器配置。确保 SSH 服务器正在监听端口 22,并且允许连接。检查服务器日志以获取任何与连接失败相关的错误消息。 6. SSH 客户端配置:确保您的 SSH 客户端(如 Xshell)的配置正确。检查您是否正确填写了用户名、密码或私钥等身份验证凭据。 7. 使用替代端口:尝试使用其他端口来连接 SSH 服务器。如果服务器管理员配置了其他 SSH 端口(非默认的 22 端口),请尝试使用正确的端口号来连接。 8. 联系服务器管理员:如果上述方法都无法解决问题,请联系 'sz.unidairy.net' 的服务器管理员,向他们报告您的问题,并寻求进一步的帮助和支持。 请注意,上述方法仅供参考,实际操作可能会因具体情况而有所变化。在尝试任何更改之前,请确保您具备适当的权限和授权,并与服务器管理员或网络管理员协调。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值