问题 B: 通讯

时间限制: 1 Sec  内存限制: 256 MB

题面


题目描述

“这一切都是命运石之门的选择。”

试图研制时间机器的机关SERN截获了中二科学家伦太郎发往过去的一条短 信,并由此得知了伦太郎制作出了电话微波炉(仮)。

为了掌握时间机器的技术,SERN总部必须尽快将这个消息通过地下秘密通讯 网络,传达到所有分部。

SERN共有N个部门(总部编号为0),通讯网络有M条单向通讯线路,每条线 路有一个固定的通讯花费Ci。

为了保密,消息的传递只能按照固定的方式进行:从一个已知消息的部门向 另一个与它有线路的部门传递(可能存在多条通信线路)。我们定义总费用为所 有部门传递消息的费用和。

幸运的是,如果两个部门可以直接或间接地相互传递消息(即能按照上述方 法将信息由X传递到Y,同时能由Y传递到X),我们就可以忽略它们之间的花费。

由于资金问题(预算都花在粒子对撞机上了),SERN总部的工程师希望知道, 达到目标的最小花费是多少。

输入

多组数据,文件以2个0结尾。

每组数据第一行,一个整数N,表示有N个包括总部的部门(从0开始编号)。 然后是一个整数M,表示有M条单向通讯线路。

接下来M行,每行三个整数,Xi,Yi,Ci,表示第i条线路从Xi连向Yi,花费为 Ci。

输出

每组数据一行,一个整数表示达到目标的最小花费。

样例输入

3 3
0 1 100
1 2 50
0 2 100
3 3
0 1 100
1 2 50
2 1 100
2 2
0 1 50
0 1 100
0 0

样例输出

150

100

50

提示

【样例解释】

第一组数据:总部把消息传给分部1,分部1再传给分部2.总费用:100+50=150.

第二组数据:总部把消息传给分部1,由于分部1和分部2可以互相传递消息,所以分部1可以无费用把消息传给2.总费用:100+0=100.

第三组数据:总部把消息传给分部1,最小费用为50.总费用:50.

【数据范围】

对于10%的数据,保证M=N-1

对于另30%的数据,N ≤ 20 ,M ≤ 20

对于100%的数据,N ≤ 50000 ,M ≤ 10^5 ,Ci ≤ 10^5 ,

数据组数 ≤ 5 ,数据保证一定可以将信息传递到所有部门。

考试心路历程


拿到题很激动,终于在考试里面看到了图论题。而且貌似是最拿手的有向图tarjan强连通分量缩点+最短路。

然后就这么打了。还是没认真读题,花了30分钟码出来tarjan和dijkstra,还问了老师有没有负边权。

结果样例都过不去。心态有点崩。然后柳暗花明,kruskal,跳进了最小生成树的坑里就没起来。

这是有向图欸。我是怎么“天才”地把无向图算法引入到有向图里面的?这个本应贪心100却最小生成树10分的教训我能记一辈子。。

再学图论算法一定要把有向图和无向图看清楚!

题解


膜一发tarjan大神!

因为是有向图,而且题面明显给到了“如果两个部门可以直接或间接地相互传递消息我们就可以忽略它们之间的花费”

这几乎就是强连通分量的标准定义了。tarjan强连通分量缩点板子。

不知道各位大神怎么处理的贪心,我建了个反图然后跑出来每个点入边中的最小值。

因为“数据保证一定可以将信息传递到所有部门”,所以贪心策略正确。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
#include<stack>
#include<algorithm>
#define rint register int
using namespace std;
int n,m,xi,yi,ci,tot,first[],first_f[];
struct node{int u,v,w,nxt;}edge[],edge_q[],edge_f[];
int tot_q,first_q[];
stack <int> s;
int dfn[],low[],cnt,sum,sum1;
bool ins[];
int dist[],fa[];
int belong[],dp[];
bool vis[];
long long ans=;
inline void renew()
{
tot=tot_q=cnt=sum=ans=;
for(rint i=;i<=n;++i)
{first[i]=first_q[i]=dfn[i]=low[i]=belong[i]=first_f[i]=;ins[i]=vis[i]=false;fa[i]=i;}
for(rint i=;i<=m;++i)
edge[i].u=edge[i].v=edge[i].w=edge[i].nxt=,
edge_q[i].u=edge_q[i].v=edge_q[i].w=edge_q[i].nxt=,
edge_f[i].u=edge_f[i].v=edge_f[i].w=edge_f[i].nxt=;
}
inline int get(int x){return x==fa[x]?x:fa[x]=get(fa[x]);}
inline bool cmp(node aa,node bb){return aa.w<bb.w;}
inline void add(int uu,int vv,int ww)
{
++tot;
edge[tot].u=uu;
edge[tot].v=vv;
edge[tot].w=ww;
edge[tot].nxt=first[uu];
first[uu]=tot;
}
inline void add_q(int uu,int vv,int ww)
{
++sum;
edge_q[sum].u=uu;
edge_q[sum].v=vv;
edge_q[sum].w=ww;
edge_q[sum].nxt=first_q[uu];
first_q[uu]=sum;
}
inline void add_f(int uu,int vv,int ww)
{
++sum1;
edge_f[sum1].u=uu;
edge_f[sum1].v=vv;
edge_f[sum1].w=ww;
edge_f[sum1].nxt=first_f[uu];
first_f[uu]=sum1;
}
inline void tarjan(int x)
{
dfn[x]=low[x]=++cnt;
s.push(x);ins[x]=;
for(rint i=first[x];i;i=edge[i].nxt)
{
int y=edge[i].v;
if(!dfn[y])
{
tarjan(y);
low[x]=min(low[x],low[y]);
}
else if(ins[y])
low[x]=min(low[x],dfn[y]);
}
if(dfn[x]==low[x])
{
tot_q++;
while()
{
int l_top=s.top();
s.pop();ins[l_top]=false;
belong[l_top]=tot_q;
if(l_top==x)break;
}
}
return ;
}
int main()
{
while()
{
scanf("%d %d",&n,&m);
if(n==&&m==)return ;
renew();
for(rint i=;i<=m;++i)
{
scanf("%d %d %d",&xi,&yi,&ci);
xi++,yi++;
add(xi,yi,ci);
}
tarjan();
for(rint i=;i<=n;++i)
for(rint j=first[i];j;j=edge[j].nxt)
{
int y=edge[j].v;
if(belong[i]==belong[y])continue;
add_q(belong[i],belong[y],edge[j].w);
add_f(belong[y],belong[i],edge[j].w);
}
for(rint i=;i<=tot_q;++i)
{
if(i==belong[])continue;
int minn=0x7fffffff;
for(rint j=first_f[i];j;j=edge_f[j].nxt)
{
minn=min(edge_f[j].w,minn);
}
ans+=minn;
}
printf("%lld\n",ans);
}
}

「题解」:07.16NOIP模拟T2:通讯的更多相关文章

  1. 「题解」「美团 CodeM 资格赛」跳格子

    目录 「题解」「美团 CodeM 资格赛」跳格子 题目描述 考场思路 思路分析及正解代码 「题解」「美团 CodeM 资格赛」跳格子 今天真的考自闭了... \(T1\) 花了 \(2h\) 都没有搞 ...

  2. 「题解」「HNOI2013」切糕

    文章目录 「题解」「HNOI2013」切糕 题目描述 思路分析及代码 题目分析 题解及代码 「题解」「HNOI2013」切糕 题目描述 点这里 思路分析及代码 题目分析 这道题的题目可以说得上是史上最 ...

  3. 「题解」JOIOI 王国

    「题解」JOIOI 王国 题目描述 考场思考 正解 题目描述 点这里 考场思考 因为时间不太够了,直接一上来就着手暴力.但是本人太菜,居然暴力爆 000 ,然后当场自闭- 一气之下,发现对 60pts ...

  4. 「题解」:07.16NOIP模拟T1:礼物

    问题 A: 礼物 时间限制: 1 Sec  内存限制: 256 MB 题面 题目描述 夏川的生日就要到了.作为夏川形式上的男朋友,季堂打算给夏川买一些生 日礼物. 商店里一共有种礼物.夏川每得到一种礼 ...

  5. 「题解」:07.18NOIP模拟赛T1:星际旅行

    问题 A: 星际旅行 时间限制: 1 Sec  内存限制: 256 MB 题面 题面谢绝公开. 考试心路历程 拿到这道题感觉很懵逼,所以先搞的T2和T3,最后码了个暴力,结果还不如直接输出‘0’得分高 ...

  6. 「题解」NOIP模拟测试题解乱写II(36)

    毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...

  7. 「题解」NOIP模拟测试题解乱写I(29-31)

    NOIP模拟29(B) T1爬山 简单题,赛时找到了$O(1)$查询的规律于是切了. 从倍增LCA那里借鉴了一点东西:先将a.b抬到同一高度,然后再一起往上爬.所用的步数$×2$就是了. 抬升到同一高 ...

  8. 「题解」「2014 NOI模拟赛 Day7」冒泡排序

    目录 题目 考场思考 正解 题目勾起了我对我蒟蒻时代的回忆,虽然我现在也蒟蒻 题目 点这里 可能链接会挂,在网上搜题目就有. 毕竟 \(BZOJ\) 有点老了... 考场思考 本来以为十分友善的一道题 ...

  9. 「 题解」NOIP2021模拟赛(2021-07-19)

    小兔的话 欢迎大家在评论区留言哦~ D - 矩阵 简单题意 一个 \(i * i\) 的 \(01\) 矩阵,若满足 每一行 和 每一列 都满足 恰好 有 \(2\) 个位置是 \(1\) 时,称为 ...

随机推荐

  1. Centos7搭建SkyWalking分布式追踪,以mysql为存储

    Skywalking专门为微服务架构和云原生架构系统而设计并且支持分布式链路追踪的APM系统,即应用性能监控系统,为微服务架构和云原生架构系统设计.它通过探针自动收集所需的指标,并进行分布式追踪.通过 ...

  2. Windows添加右键新增.md文件

    因为习惯用Markdown来写文档, 所以常常需要新建.md文档,但由于Windows并不会自带把.md文档放入右键新建项中(像Word那样),所以方便起见,自己手动设置,其实就是把它写进Window ...

  3. The 'with' and 'as' Keywords

    Programming is all about getting the computer to do the work. Is there a way to get Python to automa ...

  4. python语法学习

    global关键字(内部作用域想要对外部作用域的变量进行修改) decator装饰器,说白了就是一个函数指针的传递 *arg,**kwarg, 分别为tuple,dic传递

  5. luoguP1313 [NOIp2011]计算系数 [组合数学]

    题目描述 给定一个多项式(by+ax)^k,请求出多项式展开后x^n*y^m 项的系数. 输入输出格式 输入格式: 输入文件名为factor.in. 共一行,包含5 个整数,分别为 a ,b ,k , ...

  6. (转)JMS简明学习教程

    转:http://www.cnblogs.com/jjj250/archive/2012/08/08/2628552.html 基础篇 JMS是应用系统或组件之间相互通信的应用程序接口,利用它,我们可 ...

  7. MAC OpenGL 环境搭建

    MAC OpenGL 环境搭建 基础库介绍 先要安装两个库一个是GLEW(OpenGL Extension Wrangler Library),另外一个是GLFW(Graphics Library F ...

  8. Xen的体系结构

    1. BIOS的虚拟化 xen的启动过程,与x86系统一样,首先要进入保护模式,然后安装中断处理程序. xen的中断处理程序可以分为几种,有的是直接分发给正在运行的操作系统,有的是分发给安装了硬件驱动 ...

  9. hql 跟 sql 区别

    hql 跟 sql 区别  1.hql与sql的区别 sql 面向数据库表查询 hql 面向对象查询 hql : from 后面跟的 类名+类对象 where 后 用对象的属性做条件 sql: fro ...

  10. MFS分布式文件系统【4】客户端的挂载MFS存储空间

    挂载基于MooseFS 分布式文件,客户端主机必须安装FUSE软件包(FUSE版本号至少2.6,推荐版本号大于2.7的fuse) [root@master ~]# rpm -qa|grep fuse ...