「题解」:07.16NOIP模拟T2:通讯
问题 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:通讯的更多相关文章
- 「题解」「美团 CodeM 资格赛」跳格子
目录 「题解」「美团 CodeM 资格赛」跳格子 题目描述 考场思路 思路分析及正解代码 「题解」「美团 CodeM 资格赛」跳格子 今天真的考自闭了... \(T1\) 花了 \(2h\) 都没有搞 ...
- 「题解」「HNOI2013」切糕
文章目录 「题解」「HNOI2013」切糕 题目描述 思路分析及代码 题目分析 题解及代码 「题解」「HNOI2013」切糕 题目描述 点这里 思路分析及代码 题目分析 这道题的题目可以说得上是史上最 ...
- 「题解」JOIOI 王国
「题解」JOIOI 王国 题目描述 考场思考 正解 题目描述 点这里 考场思考 因为时间不太够了,直接一上来就着手暴力.但是本人太菜,居然暴力爆 000 ,然后当场自闭- 一气之下,发现对 60pts ...
- 「题解」:07.16NOIP模拟T1:礼物
问题 A: 礼物 时间限制: 1 Sec 内存限制: 256 MB 题面 题目描述 夏川的生日就要到了.作为夏川形式上的男朋友,季堂打算给夏川买一些生 日礼物. 商店里一共有种礼物.夏川每得到一种礼 ...
- 「题解」:07.18NOIP模拟赛T1:星际旅行
问题 A: 星际旅行 时间限制: 1 Sec 内存限制: 256 MB 题面 题面谢绝公开. 考试心路历程 拿到这道题感觉很懵逼,所以先搞的T2和T3,最后码了个暴力,结果还不如直接输出‘0’得分高 ...
- 「题解」NOIP模拟测试题解乱写II(36)
毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...
- 「题解」NOIP模拟测试题解乱写I(29-31)
NOIP模拟29(B) T1爬山 简单题,赛时找到了$O(1)$查询的规律于是切了. 从倍增LCA那里借鉴了一点东西:先将a.b抬到同一高度,然后再一起往上爬.所用的步数$×2$就是了. 抬升到同一高 ...
- 「题解」「2014 NOI模拟赛 Day7」冒泡排序
目录 题目 考场思考 正解 题目勾起了我对我蒟蒻时代的回忆,虽然我现在也蒟蒻 题目 点这里 可能链接会挂,在网上搜题目就有. 毕竟 \(BZOJ\) 有点老了... 考场思考 本来以为十分友善的一道题 ...
- 「 题解」NOIP2021模拟赛(2021-07-19)
小兔的话 欢迎大家在评论区留言哦~ D - 矩阵 简单题意 一个 \(i * i\) 的 \(01\) 矩阵,若满足 每一行 和 每一列 都满足 恰好 有 \(2\) 个位置是 \(1\) 时,称为 ...
随机推荐
- vue组件 is ref
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 72.Properties(配置文件)
Properties(配置文件):主要用于存储配置文件到硬盘上面和读取配置文件 public class Properties extends Hashtable<Object,Object&g ...
- bzoj 2561
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2561 考虑做mst的时候,什么时候这条边不在这棵mst上呢? 就是比他小的权值的边讲这条边的 ...
- thinkphp SAE
SAE介绍 Sina App Engine(简称SAE)是新浪研发中心开发的国内首个公有云计算平台,是新浪云计算战略的核心组成部分,作为一个简单高效的分布式Web服务开发.运行平台越来越受开发者青睐. ...
- 汇编检测OD代码
repnz指令说明:重复执行其后面的指令,CX或ECX存放最多比较次数,DI或EDI存放查找表首地址,AL或AX或EAX存放想查找的内容.当(CX或ECX)= 0 或 ZF=1 退出重复,否则,(CX ...
- postgreSQL的主外键
--添加主键 alter table cities add PRIMARY KEY(name); --添加外键 alter table weather add FOREIGN key(city) RE ...
- 通过adb命令查看SN、CID码等信息
用ADB命令来查看自己手机的相关硬件以及其他的参数信息,相信许多机友已经早已查看过,而新入门感兴趣的机友可以尝试一下. 运用这些ADB命令可以很直观的查看到你手机上的硬件与软件方面的详细信息. 下 ...
- UVA 10522 Height to Area(知三角形三高求面积)
思路:海伦公式, AC代码: #include<bits/stdc++.h> using namespace std; int main() { int n; scanf("%d ...
- 引入scss(@import)和其中易错点
1.引入文件方式 @import 'url'; ./ :当前目录 ../ :上级目录 src/api/styles: 绝对路径 2.一般在main.js中引用当做全局样式 import 'styles ...
- Vue 学习笔记之 —— 组件(踩了个坑)
最近在学习vue,学习组件时,遇到了一个问题,困扰了半个多小时.. <!DOCTYPE html> <html lang="en"> <head> ...