2018.06.29 NOIP模拟 Minimum(最小生成树)
Minimum
题目背景
SOURCE:NOIP2015-SHY-2
题目描述
给出一幅由 n 个点 m 条边构成的无向带权图。
其中有些点是黑点,另外点是白点。
现在每个白点都要与他距离最近的所有黑点通过最短路连接(如果有很多个,可以选取其中任意一个),我们想要使得花费的代价最小。请问这个最小代价是多少?
注意:最后选出的边保证每个白点到黑点的距离任然是最短距离。
输入格式
第一行两个整数 n,m ;
第二行 n 个整数,0 表示白点,1 表示黑点;
接下来 m 行,每行三个整数 x,y,z ,表示一条连接 x 和 y 点,权值为 z 的边。
输出格式
如果无解,输出“impossible”,否则,输出最小代价。
样例数据 1
输入
5 7
0 1 0 1 0
1 2 11
1 3 1
1 5 17
2 3 1
3 5 18
4 5 3
2 4 5
输出
5
备注
【样例说明】
选 2、4、6 三条边。
【数据范围】
对 30% 的输入数据 :1≤n≤10,1≤m≤20;
对 100% 的输入数据 :1≤n≤100000,1≤m≤200000,1≤z≤1000000000 。
这道题思路考试时想到了,但不知为何莫名写挂完美爆零。
我们将解题步骤拆成两部分。
首先,我们要求出距离每个白点最近的黑点,这个用个最短路就求出来了,so" role="presentation" style="position: relative;">soso easy" role="presentation" style="position: relative;">easyeasy。
然后我们只用统计答案就行了,但怎么确定边呢?最小生成树即可。
但不幸的是我考试gg" role="presentation" style="position: relative;">gggg了。
代码如下;
#include<bits/stdc++.h>
#define N 300005
#define M 600005
#define ll long long
#define inf 0x3f3f3f3f3f3f3f3f3f
using namespace std;
struct node{int v,next,w;}e[M<<1];
struct Node{int u,v,w;}q[N];
bool vis[N];
struct heap{int u;ll d;};
inline bool operator<(heap a,heap b){return a.d>b.d;}
ll d[N];
int col[N],cnt=0,n,m,first[N],tot=0,fa[N];
inline ll read(){
ll ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+ch-'0',ch=getchar();
return ans;
}
inline void add(int u,int v,int w){
e[++cnt].v=v;
e[cnt].w=w;
e[cnt].next=first[u];
first[u]=cnt;
}
inline int find(int x){return x==fa[x]?fa[x]:find(fa[x]);}
inline void dijsktra(){
memset(d,inf,sizeof(d));
memset(vis,false,sizeof(vis));
d[0]=0;
priority_queue<heap>s;
s.push((heap){0,0});
while(!s.empty()){
heap x=s.top();
s.pop();
if(vis[x.u])continue;
vis[x.u]=1;
for(int i=first[x.u];i!=-1;i=e[i].next){
int v=e[i].v;
if(d[v]>d[x.u]+e[i].w){
d[v]=d[x.u]+e[i].w;
s.push((heap){v,d[v]});
}
}
}
}
inline bool cmp(Node a,Node b){return a.w<b.w;}
int main(){
memset(first,-1,sizeof(first));
n=read(),m=read();
for(int i=1;i<=n;++i){
col[i]=read();
if(col[i])add(0,i,0);
}
for(int i=1;i<=m;++i){
int x,y,z;
x=read(),y=read(),z=read();
add(x,y,z),add(y,x,z);
}
dijsktra();
for(int i=1;i<=n;++i){
if(d[i]==inf){
printf("impossible");
return 0;
}
for(int j=first[i];j!=-1;j=e[j].next)
if(d[e[j].v]+e[j].w==d[i])q[++tot].u=i,q[tot].v=e[j].v,q[tot].w=e[j].w;
}
sort(q+1,q+tot+1,cmp);
for(int i=0;i<=n;++i)fa[i]=i;
ll ans=0;
cnt=n;
for(int i=1;i<=tot;++i){
if(!cnt)break;
int fx=find(q[i].u),fy=find(q[i].v);
if(fx!=fy){
fa[fx]=fy;
ans+=q[i].w;
--cnt;
}
}
printf("%lld",ans);
return 0;
}
2018.06.29 NOIP模拟 Minimum(最小生成树)的更多相关文章
- 2018.06.29 NOIP模拟 Gcd(容斥原理)
Gcd 题目背景 SOURCE:NOIP2015-SHY-2 题目描述 给出n个正整数,放入数组 a 里. 问有多少组方案,使得我从 n 个数里取出一个子集,这个子集的 gcd 不为 1 ,然后我再从 ...
- 2018.06.29 NOIP模拟 1807(简单递推)
1807 题目背景 SOURCE:NOIP2015-SHY-2 题目描述 给出一个由数字('0'-'9')构成的字符串.我们说一个子序列是好的,如果他的每一位都是 1.8.0.7 ,并且这四个数字按照 ...
- 2018.06.29 NOIP模拟 繁星(前缀和)
繁星 [问题描述] 要过六一了,大川正在绞尽脑汁想送给小伙伴什么礼物呢.突然想起以前拍过一张夜空中的繁星的照片,这张照片已经被处理成黑白的,也就是说,每个像素只可能是两个颜色之一,白或黑.像素(x,y ...
- 2018.06.29 NOIP模拟 旅馆(线段树)
旅馆 [问题描述] OIEROIEROIER 们最近的旅游计划,是到长春净月潭,享受那里的湖光山色,以及明 媚的阳光.你作为整个旅游的策划者和负责人,选择在潭边的一家著名的旅馆住 宿.这个巨大的旅馆一 ...
- 2018.06.29 NOIP模拟 边的处理(分治+dp)
边的处理(side.cpp) [问题描述] 有一个 n 个点的无向图,给出 m 条边,每条边的信息形如<x,y,c,r><x,y,c,r><x,y,c,r>. 给出 ...
- 2018.06.29 NOIP模拟 排列(线段树)
排列(premu.cpp) [题目描述] 对于一个 1 到 n 的排列,逆序数的定义为:排列中第 i 位 ai的逆序数就是 a1-ai-1中比 ai大的数的个数.另外用 pi表示 a1,-,ai的逆序 ...
- 2018.06.29 NOIP模拟 区间(前缀和差量)
区间(interval.cpp) 时限:2000ms 空间限制:512MB [问题描述] 给出一个长度为 n 的序列 a[1]-a[n]. 给出 q 组询问,每组询问形如<x,y>< ...
- 2018.06.27 NOIP模拟 节目(支配树+可持久化线段树)
题目背景 SOURCE:NOIP2015-GDZSJNZX(难) 题目描述 学校一年一度的学生艺术节开始啦!在这次的艺术节上总共有 N 个节目,并且总共也有 N 个舞台供大家表演.其中第 i 个节目的 ...
- 2018.06.26 NOIP模拟 号码(数位dp)
题目背景 SOURCE:NOIP2015-GDZSJNZX(难) 题目描述 Mike 正在在忙碌地发着各种各样的的短信.旁边的同学 Tom 注意到,Mike 发出短信的接收方手机号码似乎都满足着特别的 ...
随机推荐
- JAVA Spring 简单的配置和操作 ( 创建实体类, 配置XML文件, 调试 )
< 1 > 实体类 Person package java_spring.modle; /** * 一个实体类( Person ) */ public class Person { pri ...
- MySQL优化十大技巧
转自:https://m.2cto.com/database/201701/557910.html MYSQL优化主要分为以下四大方面: 设计:存储引擎,字段类型,范式与逆范式 功能:索引,缓存,分区 ...
- 浅谈实体类为什么要实现Serializable接口?
序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列化对象的状态,重新创 ...
- 8 python 抽象类
1.抽象类 --类似接口 接口的概念: 自己提供给使用者来调用自己功能的方式\方法\入口, 1.1.java中接口 interface =================第一部分:Java 语言中的 ...
- UI5-文档-4.1-Hello World!
如你所知,SAPUI5是关于HTML5的.让我们开始构建第一个仅使用HTML的“Hello World”. Preview 浏览器显示文本“Hello World” Coding 你可以在此查看和下载 ...
- vue深入了解组件——组件注册
一.组件名 在注册一个组件的时候,我们始终需要给它一个名字.比如在全局注册的时候我们已经看到了: Vue.component('my-component-name', { /* ... */ }) J ...
- Mongodb 折腾笔记
简介: Mongodb 是一个由 C++ 语言编写的基于分布式文件存储的数据库,是目前最像关系型数据库的非关系型数据库. 下载地址:https://fastdl.mongodb.org/linux/m ...
- Life is in the little things --- Spreading wildly on Facebook
这是在FaceBook上疯传的一组图 简笔画的图画的不算精细 但却狠狠地击中许多人的心灵 有时候生活中简单的一件小事, 恰恰是使得你的人生变得更有意义的一件大事! 别人总告诉你 人生是这样的 ▼ ...
- 吴裕雄 数据挖掘与分析案例实战(15)——DBSCAN与层次聚类分析
# 导入第三方模块import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as snsfr ...
- DNN例子
[Tensorflow DNNClassifier ValueError]http://stackoverflow.com/questions/40264622/tensorflow-dnnclass ...