通讯(tarjan缩点)(20190716NOIP模拟测试4)
B. 通讯
题目描述
“这一切都是命运石之门的选择。”
试图研制时间机器的机关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缩点,贪心找每个点的最小入边即可(我用dfs实现,本质都是贪心)
我的tarjan+dfs(下面有天皇skyh的贪心找小边)
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
int n,m,dfn[],low[],num,st[],sp[],ins[],mi[],v[],cnt;
struct node{
int ver,len;
};
vector<node>to[],son[];
void tarjan(int x){
dfn[x]=low[x]=++num;
st[++st[]]=x;
ins[x]=;
//sort(to[x].begin(),to[x].end(),cmp);
for(int i=;i<to[x].size();i++){
node w=to[x][i];
if(!dfn[w.ver]){
tarjan(w.ver);
low[x]=min(low[x],low[w.ver]);
}
else if(ins[w.ver]) low[x]=min(low[x],dfn[w.ver]);
}
if(low[x]==dfn[x]){
cnt++;
int y;
do{
y=st[st[]--];
ins[y]=;
sp[y]=cnt;
}while(y!=x); }
}
long long dfs(int x){
v[x]=;
long long cet=;
//sort(son[x].begin(),son[x].end(),cmp);
// cout<<x<<" "<<son[x].size()<<endl;
for(int i=;i<son[x].size();i++){
node w=son[x][i];
//cout<<w.ver<<" "<<w.len<<endl;
if(v[w.ver]){
if(mi[w.ver]>w.len){
cet-=(mi[w.ver]-w.len);
mi[w.ver]=w.len;
}
continue;
}
cet+=dfs(w.ver);
cet+=w.len; mi[w.ver]=w.len;
}
///cout<<cet<<endl;
return cet; }
int main(){
scanf("%d%d",&n,&m);
while(n!=||m!=){
int x;
for(int i=;i<=m;i++){
node w;
scanf("%d%d%d",&x,&w.ver,&w.len);
w.ver++;
to[x+].push_back(w);
}
// for(int i=1;i<=n;i++) cout<<i<<" "<<to[i].size()<<endl;
for(int i=;i<=n;i++)
if(!dfn[i]) tarjan(i);
//for(int i=1;i<=n;i++) cout<<i<<" "<<to[i].size()<<endl;
for(int i=;i<=n;i++){
//cout<<i<<" "<<sp[i]<<" "<<to[i].size()<<endl;
for(int j=;j<to[i].size();j++){
node w=to[i][j];
if(sp[i]!=sp[w.ver]){
w.ver=sp[w.ver];
son[sp[i]].push_back(w);
}
}
}
/*for(int i=1;i<=cnt;i++){
cout<<i<<" "<<son[i].size()<<endl;
for(int j=0;j<son[i].size();j++){
printf("%d %d %d\n",i,son[i][j].ver,son[i][j].len);
}
}*/
long long ans=dfs(sp[]);
printf("%lld\n",ans);
for(int i=;i<=n;i++){
dfn[i]=low[i]=v[i]=sp[i]=mi[i]=v[i]=;
to[i].clear();
son[i].clear();
num=;
cnt=;
}
scanf("%d%d",&n,&m);
} }
——————————————————————————————————————————————————————————————————————————————
天皇skyh的贪心找小边
#include<iostream>
#include<cstdio>
#include<cstring>
#define db(x) cerr<<#x<<"="<<x<<endl
#define cl(x) memset(x,0,sizeof(x))
using namespace std;
const int N=,M=;
int n,m,scc;
int tot,head[N],to[M],nxt[M],w[M];
int top,stack[N],dfn[N],low[N],num,bl[N];
bool instack[N];
int imin[N];
void tarjan(int x)
{
dfn[x]=low[x]=++num;
stack[++top]=x; instack[x]=;
for(int i=head[x];i;i=nxt[i])
{
int y=to[i];
if(!dfn[y])
{
tarjan(y);
low[x]=min(low[x],low[y]);
}
else if(instack[y]) low[x]=min(low[x],dfn[y]);
}
if(dfn[x]==low[x])
{
++scc; int y;
do{
y=stack[top--];
bl[y]=scc;
instack[y]=;
}while(y!=x);
}
}
int main()
{
while(scanf("%d%d",&n,&m)==&&(n||m))
{
cl(dfn); cl(head);
memset(imin,0x3f,sizeof(imin));
tot=; top=; num=; scc=;
for(int i=,a,b,d;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&d);
a++; b++;
to[++tot]=b; w[tot]=d;
nxt[tot]=head[a]; head[a]=tot;
}
tarjan();
//db(scc);
for(int i=;i<=n;i++)
for(int j=head[i];j;j=nxt[j])
{
int y=to[j];
if(bl[i]==bl[y]) continue;
imin[bl[y]]=min(imin[bl[y]],w[j]);
}
long long ans=;
for(int i=;i<=scc;i++)
if(imin[i]<=)
ans+=imin[i];
printf("%lld\n",ans);
}
return ;
}
通讯(tarjan缩点)(20190716NOIP模拟测试4)的更多相关文章
- NOIP模拟测试2-5
该补一下以前挖的坑了 先总结一下 第二次 T1 搜索+剪枝 #include<cstdio> #include<iostream> #define ll long long u ...
- 20190716NOIP模拟赛T2 通讯(tarjan缩点+贪心)
题目描述 “这一切都是命运石之门的选择.” 试图研制时间机器的机关SERN截获了中二科学家伦太郎发往过去的一条短 信,并由此得知了伦太郎制作出了电话微波炉(仮). 为了掌握时间机器的技术,SERN总部 ...
- 【模拟7.16】通讯(tarjan缩点加拓扑排序)
这题确实水,纯板子,考试意外出错,只拿了暴力分QAQ tarjan缩点加上拓扑排序,注意这里求最短路径时不能用最小生成树 因为是单向边,不然就可能不是一个联通图了.... 1 #include< ...
- 7.16 NOIP模拟测试4 礼物+通讯+奇袭
T1 礼物 题目大意:n个物品,每次有pi的概率买到,可以重复买,也可以什么都没买到,但算一次购买,问把所有东西都买到的期望次数.对于10%的数据,N = 1;对于30%的数据,N ≤ 5;对于100 ...
- 【2019.7.26 NOIP模拟赛 T3】化学反应(reaction)(线段树优化建图+Tarjan缩点+拓扑排序)
题意转化 考虑我们对于每一对激活关系建一条有向边,则对于每一个点,其答案就是其所能到达的点数. 于是,这个问题就被我们搬到了图上,成了一个图论题. 优化建图 考虑我们每次需要将一个区间向一个区间连边. ...
- 2019.8.9 NOIP模拟测试15 反思总结
日常爆炸,考得一次比一次差XD 可能还是被身体拖慢了学习的进度吧,虽然按理来说没有影响.大家听的我也听过,大家学的我也没有缺勤多少次. 那么果然还是能力问题吗……? 虽然不愿意承认,但显然就是这样.对 ...
- NOIP模拟测试19「count·dinner·chess」
反思: 我考得最炸的一次 怎么说呢?简单的两个题0分,稍难(我还不敢说难,肯定又有人喷我)42分 前10分钟看T1,不会,觉得不可做,完全不可做,把它跳了 最后10分钟看T1,发现一个有点用的性质,仍 ...
- [Usaco2015 Jan]Grass Cownoisseur Tarjan缩点+SPFA
考试的时候忘了缩点,人为dfs模拟缩点,没想到竟然跑了30分,RB爆发... 边是可以重复走的,所以在同一个强连通分量里,无论从那个点进入从哪个点出,所有的点一定能被一条路走到. 要使用缩点. 然后我 ...
- BZOJ1823[JSOI2010]满汉全席——2-SAT+tarjan缩点
题目描述 满汉全席是中国最丰盛的宴客菜肴,有许多种不同的材料透过满族或是汉族的料理方式,呈现在數量繁多的菜色之中.由于菜色众多而繁杂,只有极少數博学多闻技艺高超的厨师能够做出满汉全席,而能够烹饪出经过 ...
随机推荐
- ELINK编程器典型场景之多APP文件下载
有些应用场合中,单MCU内会采用BootLoader+APP1+APP2的加载模式,程序启动时先进入BootLoader程序,依据设定条件跳转至APPx应用运行:为满足此类需求,设计多达5个程序文件( ...
- 理解 node.js 的事件循环
node.js 的第一个基本观点是,I/O 操作是昂贵的: 目前的编程技术最大的浪费来自等待 I/O 操作的完成.有几种方法可以解决这些对性能的影响(来自Sam Rushing): 同步:依次处理单个 ...
- Ubuntu16.04下配置laravel
参考 http://tecadmin.net/install-laravel-framework-on-ubuntu/# 本人亲试,完全正确 注意: Step 4 – Set Encryption K ...
- 虚拟化代码博客 good
推荐网站和博客地址 -------------------------------- 虚拟化代码博客 QEMU大牛博客:qemu - 韋任的維基百科 http://people.cs.nctu ...
- 检索 COM 类工厂中 CLSID 为 {{10020200-E260-11CF-AE68-00AA004A34D5}} 的组件时失败解决办法
检索 COM 类工厂中 CLSID 为 {10020200-E260-11CF-AE68-00AA004A34D5} 的组件时失败,解决方法如下: 第一步:首先将msvcr71.dll, SQLDM ...
- ab fails to connect to localhost
The following command fails: $ ab -n 1 localhost:8000/ ... Benchmarking localhost (be patient)...apr ...
- 在前后端分离项目中使用SpringBoot集成Shiro
前言 这次在处理一个小项目时用到了前后端分离,服务端使用springboot2.x.权限验证使用了Shiro.前后端分离首先需要解决的是跨域问题,POST接口跨域时会预发送一个OPTIONS请求,浏览 ...
- 从零开始的Wordpress个人博客搭建
0x00前言 在博客园写了有一年的博客了,也想换换新口味,wordpress的众多的主题和个性化设置非常符合我的喜好,所以捣鼓了一天也算是把它搭好了. 直接在服务器上搭建wordpress还需要配置m ...
- Spring Boot:整合JdbcTemplate
综合概述 Spring对数据库的操作在jdbc上面做了更深层次的封装,而JdbcTemplate便是Spring提供的一个操作数据库的便捷工具.我们可以借助JdbcTemplate来执行所有数据库操作 ...
- 【设计模式】结构型03外观模式(Facade Pattern)
[设计模式]结构型02装饰模式(Decorator Pattern) 意图:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 主要解决:降低访问 ...