Codeforces 1095F Make It Connected 【MST】
<题目链接>
题目大意:
给定一张$n$个顶点(每个顶点有点权)的无向图,并且给出边权为$w_i$的m条边,顶点$u$和顶点$v$直接如果建边,边权为$a_u + a_v$,求图连通的最小边权和。
解题分析:
可以发现,如果仅仅只是考虑根据点权连边的话,那么最优的情况就是所有点(除点权最小的点)与点权最小的点相连。如果加上题目给出的边权综合考虑,我们就是将这m+n-1条边加入考虑的范围内,然后根据这些边建一颗最小生成树。
#include <bits/stdc++.h>
using namespace std; typedef long long ll;
#define N int(2e5+7)
#define rep(i,s,t) for(int i=s;i<=t;i++)
int n,m,pre[N];
ll val[N]; struct Edge{
int fi,se;
ll cost;
Edge(int _fi=,int _se=,ll _cost=):fi(_fi),se(_se),cost(_cost){}
bool operator<(const Edge & tmp)const {
return cost<tmp.cost;
}
}edge[N<<]; //最多只用考虑m+n-1条边 vector<Edge>vec; int find(int x){ return pre[x]==x?x:pre[x]=find(pre[x]); } void Kruskal(){
ll sum=,cnt=;
sort(vec.begin(),vec.end());
for(int i=;i<vec.size();i++){
Edge now=vec[i];
int f1=find(now.fi),f2=find(now.se);
if(f1!=f2){
pre[f1]=f2;
sum+=now.cost;
cnt++;
}
if(cnt>=n-)break;
}
printf("%lld\n",sum);
} int main(){
scanf("%d%d",&n,&m);
ll mn=1e18;int mnloc=-;
rep(i,,n){
scanf("%lld",&val[i]);
pre[i]=i;
if(val[i]<mn)mn=val[i],mnloc=i; //记录最小的节点序号和权值
}
rep(i,,m){
int u,v;ll w;scanf("%d%d%lld",&u,&v,&w);
vec.push_back(Edge(u,v,w)); //真实的边权
}
rep(i,,n){
if(i==mnloc)continue;
vec.push_back(Edge(i,mnloc,val[i]+mn)); //点间连边的点权之和
}
Kruskal();
}
2019-02-21
Codeforces 1095F Make It Connected 【MST】的更多相关文章
- [CodeForces - 1225E]Rock Is Push 【dp】【前缀和】
[CodeForces - 1225E]Rock Is Push [dp][前缀和] 标签:题解 codeforces题解 dp 前缀和 题目描述 Time limit 2000 ms Memory ...
- Codeforces 716B Complete the Word【模拟】 (Codeforces Round #372 (Div. 2))
B. Complete the Word time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
- POJ2485 Highways 【MST】
Highways Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22842 Accepted: 10525 Descri ...
- Codeforces Round #382 Div. 2【数论】
C. Tennis Championship(递推,斐波那契) 题意:n个人比赛,淘汰制,要求进行比赛双方的胜场数之差小于等于1.问冠军最多能打多少场比赛.题解:因为n太大,感觉是个构造.写写小数据, ...
- Codeforces Beta Round #62 题解【ABCD】
Codeforces Beta Round #62 A Irrational problem 题意 f(x) = x mod p1 mod p2 mod p3 mod p4 问你[a,b]中有多少个数 ...
- Codeforces 839A Arya and Bran【暴力】
A. Arya and Bran time limit per test:1 second memory limit per test:256 megabytes input:standard inp ...
- Codeforces 1095F Make It Connected(最小生成树)
题目链接:Make It Connected 题意:给定一张$n$个顶点(每个顶点有权值$a_i$)的无向图,和已连接的拥有边权$w_i$的$m$条边,顶点u和顶点v直接如果新建边,边权为$a_u+a ...
- 【MST】P2323 [HNOI2006]公路修建问题
Description 给定 \(n\) 个点 \(m - 1\) 条无向边,每条边有两种边权,贵一点的和便宜一点的.要求至少选择 \(k\) 条贵边使得图联通且花费最大的边权值最小. Input 第 ...
- CodeForces - 580C Kefa and Park 【BFS】
题目链接 http://codeforces.com/problemset/problem/580/C 题意 根节点是 1 然后所有的叶子结点都是饭店 从根节点到叶子结点的路径上 如果存在 大于m 个 ...
随机推荐
- Ubuntu16.04安装MySQL
本篇教程在示例步骤中使用了以下版本的软件.操作时,请您以实际软件版本为准. 操作系统:Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-105-generic x86_64) ...
- 关于《common-net》的ftp上传
1:jar的maven的引用: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http ...
- Confluence 6 使用 WebDAV 客户端来对页面进行操作
下面的部分告诉你如何在不同的系统中来设置原生的 WebDAV 客户端,这个客户端通常显示在你操作系统的文件浏览器中,例如,Windows 的 Windows Explorer 或者 Linux 的 K ...
- Confluence 6 从外部小工具中注册访问
希望从 Confluence 中删除一个小工具,你可以选择小工具边上的 URL ,然后单击删除(Delete). 如果你希望取消订阅一个应用的小工具,你需要删除整个订阅.你不能仅仅删除你订阅中的某一个 ...
- Confluence 6 配置默认语言界面
Confluence 6 配置默认语言使用的界面. https://www.cwiki.us/display/CONFLUENCEWIKI/Choosing+a+Default+Language
- python自动化-unittest批量执行用例(discover)
前言 我们在写用例的时候,单个脚本的用例好执行,那么多个脚本的时候,如何批量执行呢?这时候就需要用到unittet里面的discover方法来加载用例了. 加载用例后,用unittest里面的Text ...
- GitHub搭配使用Travis CI 进行自动构建服务
Travis CI (Continuous Integration)持续集成服务 用处:自动监控软件仓库,可以在代码提交后立刻执行自动测试或构建 1.在Github自己的仓库根目录里添加.travis ...
- cf1132G 线段树解分区间LIS(一种全新的线段树解LIS思路)+单调栈
/* 给定n个数的数列,要求枚举长为k的区间,求出每个区间的最长上升子序列长度 首先考虑给定n个数的数列的LIS求法:从左往右枚举第i点作为最大点的贡献, 那么往左找到第一个比a[i]大的数,设这个数 ...
- Python中的xxx == xx是否等价于xxx is xxx
先上代码: >>> a = 1 >>> b = 1 >>> a is b True >>> a == b True what? ...
- urls.py的配置[路由配置]
urls.py的配置[路由配置] Get请求与Post请求的方式 get请求: (1)地址栏输入url (2)<a href="请求url">点击</a> ...