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了。

代码如下;

  1. #include<bits/stdc++.h>
  2. #define N 300005
  3. #define M 600005
  4. #define ll long long
  5. #define inf 0x3f3f3f3f3f3f3f3f3f
  6. using namespace std;
  7. struct node{int v,next,w;}e[M<<1];
  8. struct Node{int u,v,w;}q[N];
  9. bool vis[N];
  10. struct heap{int u;ll d;};
  11. inline bool operator<(heap a,heap b){return a.d>b.d;}
  12. ll d[N];
  13. int col[N],cnt=0,n,m,first[N],tot=0,fa[N];
  14. inline ll read(){
  15. ll ans=0;
  16. char ch=getchar();
  17. while(!isdigit(ch))ch=getchar();
  18. while(isdigit(ch))ans=(ans<<3)+(ans<<1)+ch-'0',ch=getchar();
  19. return ans;
  20. }
  21. inline void add(int u,int v,int w){
  22. e[++cnt].v=v;
  23. e[cnt].w=w;
  24. e[cnt].next=first[u];
  25. first[u]=cnt;
  26. }
  27. inline int find(int x){return x==fa[x]?fa[x]:find(fa[x]);}
  28. inline void dijsktra(){
  29. memset(d,inf,sizeof(d));
  30. memset(vis,false,sizeof(vis));
  31. d[0]=0;
  32. priority_queue<heap>s;
  33. s.push((heap){0,0});
  34. while(!s.empty()){
  35. heap x=s.top();
  36. s.pop();
  37. if(vis[x.u])continue;
  38. vis[x.u]=1;
  39. for(int i=first[x.u];i!=-1;i=e[i].next){
  40. int v=e[i].v;
  41. if(d[v]>d[x.u]+e[i].w){
  42. d[v]=d[x.u]+e[i].w;
  43. s.push((heap){v,d[v]});
  44. }
  45. }
  46. }
  47. }
  48. inline bool cmp(Node a,Node b){return a.w<b.w;}
  49. int main(){
  50. memset(first,-1,sizeof(first));
  51. n=read(),m=read();
  52. for(int i=1;i<=n;++i){
  53. col[i]=read();
  54. if(col[i])add(0,i,0);
  55. }
  56. for(int i=1;i<=m;++i){
  57. int x,y,z;
  58. x=read(),y=read(),z=read();
  59. add(x,y,z),add(y,x,z);
  60. }
  61. dijsktra();
  62. for(int i=1;i<=n;++i){
  63. if(d[i]==inf){
  64. printf("impossible");
  65. return 0;
  66. }
  67. for(int j=first[i];j!=-1;j=e[j].next)
  68. 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;
  69. }
  70. sort(q+1,q+tot+1,cmp);
  71. for(int i=0;i<=n;++i)fa[i]=i;
  72. ll ans=0;
  73. cnt=n;
  74. for(int i=1;i<=tot;++i){
  75. if(!cnt)break;
  76. int fx=find(q[i].u),fy=find(q[i].v);
  77. if(fx!=fy){
  78. fa[fx]=fy;
  79. ans+=q[i].w;
  80. --cnt;
  81. }
  82. }
  83. printf("%lld",ans);
  84. return 0;
  85. }

2018.06.29 NOIP模拟 Minimum(最小生成树)的更多相关文章

  1. 2018.06.29 NOIP模拟 Gcd(容斥原理)

    Gcd 题目背景 SOURCE:NOIP2015-SHY-2 题目描述 给出n个正整数,放入数组 a 里. 问有多少组方案,使得我从 n 个数里取出一个子集,这个子集的 gcd 不为 1 ,然后我再从 ...

  2. 2018.06.29 NOIP模拟 1807(简单递推)

    1807 题目背景 SOURCE:NOIP2015-SHY-2 题目描述 给出一个由数字('0'-'9')构成的字符串.我们说一个子序列是好的,如果他的每一位都是 1.8.0.7 ,并且这四个数字按照 ...

  3. 2018.06.29 NOIP模拟 繁星(前缀和)

    繁星 [问题描述] 要过六一了,大川正在绞尽脑汁想送给小伙伴什么礼物呢.突然想起以前拍过一张夜空中的繁星的照片,这张照片已经被处理成黑白的,也就是说,每个像素只可能是两个颜色之一,白或黑.像素(x,y ...

  4. 2018.06.29 NOIP模拟 旅馆(线段树)

    旅馆 [问题描述] OIEROIEROIER 们最近的旅游计划,是到长春净月潭,享受那里的湖光山色,以及明 媚的阳光.你作为整个旅游的策划者和负责人,选择在潭边的一家著名的旅馆住 宿.这个巨大的旅馆一 ...

  5. 2018.06.29 NOIP模拟 边的处理(分治+dp)

    边的处理(side.cpp) [问题描述] 有一个 n 个点的无向图,给出 m 条边,每条边的信息形如<x,y,c,r><x,y,c,r><x,y,c,r>. 给出 ...

  6. 2018.06.29 NOIP模拟 排列(线段树)

    排列(premu.cpp) [题目描述] 对于一个 1 到 n 的排列,逆序数的定义为:排列中第 i 位 ai的逆序数就是 a1-ai-1中比 ai大的数的个数.另外用 pi表示 a1,-,ai的逆序 ...

  7. 2018.06.29 NOIP模拟 区间(前缀和差量)

    区间(interval.cpp) 时限:2000ms 空间限制:512MB [问题描述] 给出一个长度为 n 的序列 a[1]-a[n]. 给出 q 组询问,每组询问形如<x,y>< ...

  8. 2018.06.27 NOIP模拟 节目(支配树+可持久化线段树)

    题目背景 SOURCE:NOIP2015-GDZSJNZX(难) 题目描述 学校一年一度的学生艺术节开始啦!在这次的艺术节上总共有 N 个节目,并且总共也有 N 个舞台供大家表演.其中第 i 个节目的 ...

  9. 2018.06.26 NOIP模拟 号码(数位dp)

    题目背景 SOURCE:NOIP2015-GDZSJNZX(难) 题目描述 Mike 正在在忙碌地发着各种各样的的短信.旁边的同学 Tom 注意到,Mike 发出短信的接收方手机号码似乎都满足着特别的 ...

随机推荐

  1. web常见攻击

    DoS和DDoS攻击 DoS(Denial of Service),即拒绝服务,造成远程服务器拒绝服务的行为被称为DoS攻击.其目的是使计算机或网络无法提供正常的服务.最常见的DoS攻击有计算机网络带 ...

  2. 关于RabbitMQ以及RabbitMQ和Spring的整合

    转自:https://www.cnblogs.com/s648667069/p/6401463.html 基本概念 RabbitMQ是流行的开源消息队列系统,用erlang语言开发.RabbitMQ是 ...

  3. maven项目中的报错问题——Dynamic Web Module 3.0 requires Java 1.6 or newer.

    转自:http://www.cnblogs.com/beppezhang/p/5919221.html maven项目中的报错问题——Dynamic Web Module 3.0 requires J ...

  4. spring 整合 struts2 xml配置

    整合之前要搞清楚struts2是什么; struts2:表现层框架  增删改查  作用域  页面跳转   异常处理  ajax 上传下载  excel   调用service spring :IOC/ ...

  5. linux一些基本常识(四)

    tail -f时时监控 一开启内存最小位u原则,尽量优化代码 grep -v "" /etc/passwd 这样行不行 怎么清除last nice调整进程运行级别 pkill是匹配 ...

  6. ubuntu中vim的设置

    问题:刚安装的VIM中,backspace不能删除字符,且上下左右箭头没反应. 解决方法: sudo vi  /etc/vim/vimrc.tiny 修改 set compatible为set noc ...

  7. 如何使用eclipse搭建maven环境以及常见的错误

    这篇博客适合零基础学习maven,搭建maven以及运行项目,常见的错误,我会在结尾写出说明白,看是否和大家的错误一样,或者文章的括号注释部分也会写出一些注意点. 第一步:就是下载maven,以及配置 ...

  8. PTA 习题集5-18 打印选课学生名单(哈希)

    假设全校有最多40000名学生和最多2500门课程.现给出每个学生的选课清单,要求输出每门课的选课学生名单. 输入格式: 输入的第一行是两个正整数:N(≤40000),为全校学生总数:K(≤2500) ...

  9. python中的&&及||

    首先说明一下,在python中是没有&&及||这两个运算符的,取而代之的是英文and和or.其他运算符没有变动. 接着重点要说明的是python中的a.any(),我之所以会涉及到这个 ...

  10. 查找ipa包,删除接的ipa包