<题目链接>

题目大意:

给定一张$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】的更多相关文章

  1. [CodeForces - 1225E]Rock Is Push 【dp】【前缀和】

    [CodeForces - 1225E]Rock Is Push [dp][前缀和] 标签:题解 codeforces题解 dp 前缀和 题目描述 Time limit 2000 ms Memory ...

  2. 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 ...

  3. POJ2485 Highways 【MST】

    Highways Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22842   Accepted: 10525 Descri ...

  4. Codeforces Round #382 Div. 2【数论】

    C. Tennis Championship(递推,斐波那契) 题意:n个人比赛,淘汰制,要求进行比赛双方的胜场数之差小于等于1.问冠军最多能打多少场比赛.题解:因为n太大,感觉是个构造.写写小数据, ...

  5. 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]中有多少个数 ...

  6. Codeforces 839A Arya and Bran【暴力】

    A. Arya and Bran time limit per test:1 second memory limit per test:256 megabytes input:standard inp ...

  7. Codeforces 1095F Make It Connected(最小生成树)

    题目链接:Make It Connected 题意:给定一张$n$个顶点(每个顶点有权值$a_i$)的无向图,和已连接的拥有边权$w_i$的$m$条边,顶点u和顶点v直接如果新建边,边权为$a_u+a ...

  8. 【MST】P2323 [HNOI2006]公路修建问题

    Description 给定 \(n\) 个点 \(m - 1\) 条无向边,每条边有两种边权,贵一点的和便宜一点的.要求至少选择 \(k\) 条贵边使得图联通且花费最大的边权值最小. Input 第 ...

  9. CodeForces - 580C Kefa and Park 【BFS】

    题目链接 http://codeforces.com/problemset/problem/580/C 题意 根节点是 1 然后所有的叶子结点都是饭店 从根节点到叶子结点的路径上 如果存在 大于m 个 ...

随机推荐

  1. JS跨域ajax访问

    方式1:jsonp解决跨域访问 需要服务和js配合 服务 [WebMethod] public void HelloWorld2(string name) { HttpContext.Current. ...

  2. 暑假里的第八篇Java

    日期:2018.9.1 博客期:008 星期六 这几天刚到学校,Java方面写的少了!目前在做老师头放假前发布的那一套题目,就是哪个Java程序测试卷.至于自己能不能都做出来我自己心里十分清楚!今天就 ...

  3. 深入分析Zookeeper的实现原理

    zookeeper 的由来 分布式系统的很多难题,都是由于缺少协调机制造成的.在分布式协调这块做得比较好的,有 Google 的 Chubby 以及 Apache 的 Zookeeper.Google ...

  4. Zookeeper安装(本地,伪分布式,集群)

    概述 ZooKeeper是一个分布式开源框架,提供了协调分布式应用的基本服务,它向外部应用暴露一组通用服务——分布式同步(Distributed Synchronization).命名服务(Namin ...

  5. python(3):文件操作/os库

      文件基本操作 r,以读模式打开,  r+=r+w, w, 写模式(清空原来的内容), w+=w+r, a , 追加模式, a+=a+r, rb, wb, ab, b表示以二进制文件打开 想在一段文 ...

  6. MongoDB----提升

    文档之间的联系 一对一:通过文档内嵌的形式体现一对一的关系 db.user.insert({name:"xiaoming",frind:{name:"xiahua&quo ...

  7. bzoj 1495

    这是一道...卡了我一个月的树形dp... 我真是太弱了... 其实仔细想想,这题的核心思路并不是特别复杂,但是的确存在不小的难度 作为一个看过全网基本所有题解+标程才弄明白这题到底怎么回事的蒟蒻,我 ...

  8. Python中字符串的截取,列表的截取

    字符串的截取 Python中的字符串用单引号 ' 或双引号 " 括起来,同时使用反斜杠 \ 转义特殊字符. 字符串的截取的语法格式如下: 变量[头下标:尾下标] 索引值以 0 为开始值,-1 ...

  9. 剑指offer之二叉树

    二叉树前序,中序,后序遍历思想 前序遍历:ABDCEFGH 中序遍历:BDAFEHGC 后序遍历:DBFHGECA 科普 队列(queue)是一种常用的数据结构,可以将队列看做是一种特殊的线性表,该结 ...

  10. JAVA代码中可使用中文类名,变量名,对象名,方法名.

    java程序 兔子 public class 兔子{ //构造方法 public 兔子(){} public void 吃草(){ System.out.println("兔子在吃草&quo ...