前言

本来在比赛上就想到最小生成树了,但不相信这道题那么简单,然后就没有然后了。。。

题目

给出一幅由n个点m条边构成的无向带权图。

其中有些点是黑点,其他点是白点。

现在每个白点都要与他距离最近的黑点通过最短路连接(如果有很多个黑点,可以选取其中任意一个),我们想要使得花费的代价最小。请问这个最小代价是多少?

注意:最后选出的边保证每个白点到离它最近的黑点的距离仍然等于原图中的最短距离。

分析

这道题最麻烦的地方就是最终搞成的图有可能有很多个联通块。

增加一个点:0点,让0点连接所有的黑点,边权为0;

处理从S发到每个点的最短距离

题目要求最小的总距离,显然搞一遍最小生成树就可以了。

#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
const long long maxlongint=2147483747;
using namespace std;
long long b[710000][4],dis[710000],next[710000],last[710000],a[710000],fa[710000],ans,tot,n,m,v[710000],d[8000000];
bool bz[710000];
void q(long long l,long long r)
{
long long i=l,j=r;
long long mid=b[(l+r)/2][0],e;
while(i<j)
{
while(b[i][0]<mid) i++;
while(b[j][0]>mid) j--;
if(i<=j)
{
e=b[i][0];
b[i][0]=b[j][0];
b[j][0]=e;
e=b[i][1];
b[i][1]=b[j][1];
b[j][1]=e;
e=b[i][2];
b[i][2]=b[j][2];
b[j][2]=e;
i++;
j--;
}
}
if(i<r) q(i,r);
if(l<j) q(l,j);
}
int spfa()
{
long long head=0,tail=1,k;
fill(dis,dis+n+m+1,maxlongint*3);
fill(bz,bz+n+m+1,true);
d[1]=0;
dis[0]=0;
while(head<tail)
{
k=d[++head];
bz[k]=true;
for(long long i=last[k];i;i=next[i])
{
if(dis[a[i]]>dis[k]+v[i])
{
dis[a[i]]=dis[k]+v[i];
if(bz[a[i]])
{
d[++tail]=a[i];
bz[a[i]]=false;
}
}
}
}
}
bool dg(long long x)
{
long long i,j;
for(i=last[x];i;i=next[i])
{
long long y=a[i];
if(dis[x]+v[i]==dis[y])
{
dg(y);
b[++tot][1]=x;
b[tot][2]=y;
b[tot][0]=v[i];
}
}
return true;
}
long long get(long long x)
{
if(x==fa[x]) return x;
long long y=get(fa[x]);
fa[x]=y;
return y;
}
int kruskal()
{
long long i,j,k,l,x,y;
for(i=1;i<=tot;i++)
{
x=get(b[i][1]);
y=get(b[i][2]);
if(x!=y)
{
ans+=b[i][0];
fa[y]=x;
}
}
}
int bj(long long x,long long y,long long k)
{
fa[y]=y;
next[++tot]=last[x];
last[x]=tot;
v[tot]=k;
a[tot]=y;
}
int main()
{
scanf("%lld%lld",&n,&m);
long long i,j,k,l,x,y;
for(i=1;i<=n;i++)
{
scanf("%lld",&x);
if(x) bj(0,i,0);
}
for(i=1;i<=m;i++)
{
scanf("%lld%lld%lld",&x,&y,&k);
bj(x,y,k);
bj(y,x,k);
}
spfa();
tot=0;
dg(0);
q(1,tot);
bool b1=maxlongint;
kruskal();
if(ans==0) cout<<"impossible";else
cout<<ans;
}

【NOIP2015模拟10.22】最小代价的更多相关文章

  1. [NOIP2015模拟10.22] 最小代价 解题报告 (最小生成树)

    Description 给出一幅由n个点m条边构成的无向带权图.其中有些点是黑点,其他点是白点.现在每个白点都要与他距离最近的黑点通过最短路连接(如果有很多个黑点,可以选取其中任意一个),我们想要使得 ...

  2. [NOIP2015模拟10.22] 最大子矩阵 解题报告(单调栈)

    Description 我们将矩阵A中位于第i行第j列的元素记作A[i,j].一个矩阵A是酷的仅当它满足下面的条件:       A[1,1]+A[r,s]<=A[1,s]+A[r,1](r,s ...

  3. JZOJ 4273. 【NOIP2015模拟10.28B组】圣章-精灵使的魔法语

    4273. [NOIP2015模拟10.28B组]圣章-精灵使的魔法语 (File IO): input:elf.in output:elf.out Time Limits: 1000 ms  Mem ...

  4. JZOJ 4269. 【NOIP2015模拟10.27】挑竹签

    4269. [NOIP2015模拟10.27]挑竹签 (File IO): input:mikado.in output:mikado.out Time Limits: 1000 ms  Memory ...

  5. JZOJ 4272. 【NOIP2015模拟10.28B组】序章-弗兰德的秘密

    272. [NOIP2015模拟10.28B组]序章-弗兰德的秘密 (File IO): input:frand.in output:frand.out Time Limits: 1000 ms  M ...

  6. [jzoj]4271. 【NOIP2015模拟10.27】魔法阵(37种转移的dp)

    题意不说 应该这辈子都不会忘记了... 这是我人生中做的最SB的一道DP题. 真的打的我心态崩了.... 可是竟然被我调出来了..... 也是没谁了... 我们设\(F[i][j][S]\)表示到第\ ...

  7. [JZOJ4272] [NOIP2015模拟10.28B组] 序章-弗兰德的秘密 解题报告(树形DP)

    Description 背景介绍弗兰德,我不知道这个地方对我意味着什么.这里是一切开始的地方.3年前,还是个什么都没见过的少年,来到弗兰德的树下,走进了封闭的密室,扭动的封尘已久机关,在石板上知道了这 ...

  8. [NOIP2015模拟10.27] 挑竹签 解题报告(拓扑排序)

    Description 挑竹签——小时候的游戏夏夜,早苗和诹访子在月光下玩起了挑竹签这一经典的游戏.挑竹签,就是在桌上摆上一把竹签,每次从最上层挑走一根竹签.如果动了其他的竹签,就要换对手来挑.在所有 ...

  9. [NOIP2015模拟10.27] [JZOJ4270] 魔道研究 解题报告(动态开点+权值线段树上二分)

    Description “我希望能使用更多的魔法.不对,是预定能使用啦.最终我要被大家称呼为大魔法使.为此我决定不惜一切努力.”——<The Grimoire of Marisa>雾雨魔理 ...

随机推荐

  1. WPF WebBrowser 加载 html ,出现安全警告, 运行 脚本和 activeX 控件,

    对于你的问题,只需要在你的HTML首行添加如下代码即可隐藏安全提示条: <!-- saved from url=(0014)about:internet --> 还有一个可选方案是使用Wi ...

  2. delphi 每英寸相素点取值偏差

    在所有资料中,每英寸相素点之比一般是这两个值,即:0.0393700788  25.399999961392 但是在GDI编程中,却遇到LOGPIXELSX  LOGPIXELSY 在取值为96DPI ...

  3. 阶段3 1.Mybatis_10.JNDI扩展知识_2 补充-JNDI搭建maven的war工程

    使用骨架 src下创建test目录 再新建java和resources两个Directory test下面创建java java的目录,让他作为源码的跟目录 test下的java文件夹 选择 完成之后 ...

  4. 5.2.k8s.Secret

    #Secret Secret存储密码.token.密钥等敏感数据 Secret以Volume或环境变量方式使用 #Secret类型 Opaque : base64 编码格式的 Secret kuber ...

  5. 深入分析微博密码加密and百万级数据采集分享(登录篇)

    一.前言 此文章主要是对微博微博关键词的检索结果进行采集,但是微博的采集需要登陆,所以此程序分为登陆程序和爬虫程序两部分: 微博要实现规模性数据采集自然少不了大量账号,这就需购买大量账号以及批量登陆, ...

  6. Bean与Map的转换 和 Map与Bean的转换

    package com.JUtils.beanConvert; import java.beans.BeanInfo; import java.beans.IntrospectionException ...

  7. [JS] 鼠标点击文本框清空默认值,离开文本框恢复默认值

    在使用文本框的时候,若设定了初始值,选择文本框进行输入的时候要将本来的内容进行删除,会显得非常麻烦 可以在文本框属性定义触发onfocus和onblur两个事件时对应的js功能 下面以asp.net代 ...

  8. 惠普IPMI登陆不上

    [问题描述] IPMI登陆不上(HP),点击无反应. 浏览器使用IE,java版本使用32位1.7版本. [问题原因] 保护此网站的证书使用弱加密,即 SHA1.此网站应该在 SHA1 被禁用之前将该 ...

  9. [转帖]探秘华为(二):华为和H3C(华三)的分道扬镳

    探秘华为(二):华为和H3C(华三)的分道扬镳 https://baijiahao.baidu.com/s?id=1620781715767053734&wfr=spider&for= ...

  10. 极*Java速成教程 - (5)

    Java语言基础 容器 这个世界是有序的,将Java对象零散地放到内存中是不符合世界常理的,特别是有一大组相似的甚至不知道有多少数据的时候.把Java对象装进盒子里可以有序收纳,这个盒子就叫容器. 初 ...