大意: 无向图, 其中k条边是你的, 边权待定, m条边是你对手的, 边权已知. 求如何设置边权能使最小生成树中, 你的边全被选到, 且你的边的边权和最大. 若有多棵最小生成树优先取你的边.

先将$k$条边合并, 然后按边权从小到大添对手的边, 若连通, 则树链取最小值, 否则合并一下.

正确性其实很显然.

然后对于树链取最小有多种方法, 强制在线可以树剖$O(nlog^2n)$, 可以离线的话可以用倍增$O(nlogn)$, 或者并查集$O(n)$.

#include <iostream>
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <math.h>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <string.h>
#include <bitset>
#define REP(i,a,n) for(int i=a;i<=n;++i)
#define PER(i,a,n) for(int i=n;i>=a;--i)
#define hr putchar(10)
#define pb push_back
#define lc (o<<1)
#define rc (lc|1)
#define mid ((l+r)>>1)
#define ls lc,l,mid
#define rs rc,mid+1,r
#define x first
#define y second
#define io std::ios::sync_with_stdio(false)
#define endl '\n'
#define DB(a) ({REP(__i,1,n) cout<<a[__i]<<' ';hr;})
using namespace std;
typedef long long ll;
const int N = 1e6+10;
int n, k, m, cnt, fa[N];
struct _ {int to,id;} pre[N];
vector<_> g[N];
struct {int u,v,w;} e[N];
int Find(int x) {return fa[x]?fa[x]=Find(fa[x]):x;}
int dep[N], ans[N]; void dfs(int x, int d, int f) {
dep[x] = d;
for (_ e:g[x]) if (e.to!=f) {
pre[e.to] = {x,e.id};
dfs(e.to,d+1,x);
}
} int main() {
scanf("%d%d%d", &n, &k, &m);
int tot = 0;
while (k--) {
int u, v;
scanf("%d%d", &u, &v);
fa[Find(u)] = Find(v);
g[u].pb({v,1}),g[v].pb({u,1});
}
REP(i,1,m) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
int uu = Find(u), vv = Find(v);
if (uu==vv) e[++cnt]={u,v,w};
else {
fa[uu] = vv;
g[u].pb({v,0}), g[v].pb({u,0});
}
}
dfs(1,0,0);
memset(fa,0,sizeof fa);
REP(i,1,cnt) {
int u = e[i].u, v = e[i].v, w = e[i].w;
while (Find(u)!=Find(v)) {
if (dep[u]<dep[v]) swap(u,v);
if (Find(u)!=Find(pre[u].to)) {
fa[u] = Find(pre[u].to);
ans[u] = w;
}
u = Find(u);
}
}
ll sum = 0;
REP(i,1,n) if (pre[i].to&&pre[i].id) {
if (!ans[i]) return puts("-1"),0;
else sum += ans[i];
}
printf("%lld\n", sum);
}

Mobile Phone Network CodeForces - 1023F (最小生成树)的更多相关文章

  1. Mobile Phone Network CodeForces - 1023F(并查集lca+修改环)

    题意: 就是有几个点,你掌控了几条路,你的商业对手也掌控了几条路,然后你想让游客都把你的所有路都走完,那么你就有钱了,但你又想挣的钱最多,真是的过分..哈哈 游客肯定要对比一下你的对手的路 看看那个便 ...

  2. 「CF1023F」Mobile Phone Network

    「CF1023F」Mobile Phone Network 传送门 直接钦定那 \(k\) 条边在最小生成树中,然后把最小生成树树剖一下. 每条其它边的效果就是把该边端点路径上的边的权对该边边权取 \ ...

  3. Codeforces1023F Mobile Phone Network 【并查集】【最小生成树】

    题目大意: 给一些没安排权值的边和安排了权值的边,没被安排的边全要被选入最小生成树,问你最大能把它们的权值和安排成多少.题目分析:假设建好了树,那么树边与剩下的每一条边都能构成一个环,并且非树边的权值 ...

  4. Solution -「CF 1023F」Mobile Phone Network

    \(\mathcal{Description}\)   Link.   有一个 \(n\) 个结点的图,并给定 \(m_1\) 条无向带权黑边,\(m_2\) 条无向无权白边.你需要为每条白边指定边权 ...

  5. Arctic Network POJ 2349 (最小生成树思想)

    Description The Department of National Defence (DND) wishes to connect several northern outposts by ...

  6. POJ2349:Arctic Network(二分+最小生成树)

    Arctic Network Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 28311   Accepted: 8570 题 ...

  7. ZOJ 1586 QS Network Kruskal求最小生成树

    QS Network Sunny Cup 2003 - Preliminary Round April 20th, 12:00 - 17:00 Problem E: QS Network In the ...

  8. codeForces 472D 最小生成树

    题目大意:给出一个图中点的两两距离,问是否是一棵树,若是,求出平均边权最大的点 prim最小生成树,若原图是树,则最小生成树的距离就是原距离.否则不是. 搞出来树了,第二问随便dfs就好了. #inc ...

  9. Xor-MST CodeForces - 888G (最小生成树,分治)

    大意: n结点无向完全图, 给定每个点的点权, 边权为两端点异或值, 求最小生成树

随机推荐

  1. java大型互联网项目大流量高并发所需的技术

    互联网一般运行技术:webservice,jquery,访问量,缓存,数据安全等,JAVA后台就比较多了,不过,像这种大型的互联网项目,基本框架都有了,你需要做的就是熟悉业务,熟悉他们公司所用的框架, ...

  2. 【零基础】神经网络优化之dropout和梯度校验

    一.序言 dropout和L1.L2一样是一种解决过拟合的方法,梯度检验则是一种检验“反向传播”计算是否准确的方法,这里合并简单讲述,并在文末提供完整示例代码,代码中还包含了之前L2的示例,全都是在“ ...

  3. python学习之模块:xlsxwriter

    1.安装xlsxwriter模块 pip install xlsxwriter 2.使用 import xlsxwriter workbook = xlsxwriter.Workbook('hello ...

  4. 关于浏览器请求PHP一次请求执行了两次

    测试同学今天又双叒反馈了一个Bug 继上次解决了重复请求的问题之后,本来就以为可以万事大吉了,没想到我还是太年轻了,测试同学说,不行啊,老哥,你这个我点击了一次创建居然创建出来两条数据!!并且查看日志 ...

  5. android滑动标题栏渐变实现

    import android.graphics.Color; import android.os.Build; import android.os.Bundle; import android.sup ...

  6. delete 删除指针

    危险的代码: int* p=new int(1);   delete p;   delete p; 安全的代码: int* p=new int(1);   delete p;   p = NULL; ...

  7. float和int转换

    http://blog.sina.com.cn/s/blog_5c6f79380101bbrd.html https://blog.csdn.net/ganxingming/article/detai ...

  8. ABAP程序并行处理

    CASE1. 程序中 start new task ,并在后面获取处理结果 *"------------------------------------------------------- ...

  9. Vue-cli安装,创建Vue项目

    1.安装脚手架: npm install -g vue-cli 2.查看vue: vue 3.查看可以使用的模板: vue list 4.创建项目sell: vue init webpack sell ...

  10. IDEA的查询引用、调用关系图的功能(转)

    转自: http://www.cnblogs.com/ghj1976/p/5382455.html Eclipse的"Call Hierarchy"可以查看一个Java方法或类成员 ...