【NOIP2016提高A组8.12】通讯
来源:互联网 发布:斗鱼tv直播伴侣mac版 编辑:程序博客网 时间:2024/05/21 17:10
Description
“这一切都是命运石之门的选择。”
试图研制时间机器的机关SERN截获了中二科学家伦太郎发往过去的一条短信,并由此得知了伦太郎制作出了电话微波炉(仮)。
为了掌握时间机器的技术,SERN总部必须尽快将这个消息通过地下秘密通讯网络,传达到所有分部。
SERN共有N个部门(总部编号为0),通讯网络有M条单向通讯线路,每条线路有一个固定的通讯花费Ci。
为了保密,消息的传递只能按照固定的方式进行:从一个已知消息的部门向另一个与它有线路的部门传递(可能存在多条通信线路)。我们定义总费用为所有部门传递消息的费用和。
幸运的是,如果两个部门可以直接或间接地相互传递消息(即能按照上述方法将信息由X传递到Y,同时能由Y传递到X),我们就可以忽略它们之间的花费。
由于资金问题(预算都花在粒子对撞机上了),SERN总部的工程师希望知道,达到目标的最小花费是多少。
Input
多组数据,文件以2个0结尾。
每组数据第一行,一个整数N,表示有N个包括总部的部门(从0开始编号)。然后是一个整数M,表示有M条单向通讯线路。
接下来M行,每行三个整数,Xi,Yi,Ci,表示第i条线路从Xi连向Yi,花费为Ci。
Output
每组数据一行,一个整数表示达到目标的最小花费。
Sample Input
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
Sample Output
150
100
50
【样例解释】
第一组数据:总部把消息传给分部1,分部1再传给分部2.总费用:100+50=150.
第二组数据:总部把消息传给分部1,由于分部1和分部2可以互相传递消息,所以分部1可以无费用把消息传给2.总费用:100+0=100.
第三组数据:总部把消息传给分部1,最小费用为50.总费用:50.
Data Constraint
对于10%的数据,保证M=N-1
对于另30%的数据,N ≤ 20 ,M ≤ 20
对于100%的数据,N ≤ 50000 ,M ≤ 10^5 ,Ci ≤ 10^5 ,数据组数 ≤ 5
数据保证一定可以将信息传递到所有部门。
Solution
如果两个点可以互相传消息,也就是说两个点在同一个强连通分量里面,它们免费,也就是说可以看做一个点。
于是先tarjan求强连通分量缩成一个点
接着对于每个点,所有连向它的边中选最小的一个即可,因为不管这条边是谁连来的,所有点都是要被选的,那么取min即可
Code
#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define fo(i,a,b) for(int i=a;i<=b;i++)#define N 50100#define clear(a) memset(a,0,sizeof(a))using namespace std;int n,m,last[N],next[N*10],to[N*10],color[N],dfn[N],low[N],tot=0,bz[N],bz2[N],s[N*10],totot=0,a[N*10][3],mi[N],mn[N];void putin(int x,int y){ next[++tot]=last[x];last[x]=tot;to[tot]=y;}void tarjan(int x){ low[x]=dfn[x]=++tot;bz[x]=bz2[x]=1;s[++s[0]]=x; for(int i=last[x];i;i=next[i]) { int y=to[i]; if(bz[y]==0){ tarjan(y);low[x]=min(low[x],low[y]); } else if(bz2[y]==1) low[x]=min(low[x],dfn[y]); } if(dfn[x]==low[x]) { totot++;s[s[0]+1]=1000000000; for(;s[s[0]+1]!=x;s[0]--) color[s[s[0]]]=totot,bz2[s[s[0]]]=0; }}int main(){ scanf("%d%d",&n,&m); for(;n!=0;) { tot=0;clear(last);clear(low);clear(dfn);clear(bz);clear(bz2);clear(s);clear(color); memset(mi,127,sizeof(mi));memset(mn,127,sizeof(mn)); fo(i,1,m) { int x,y,z;scanf("%d%d%d",&x,&y,&z); putin(x,y);a[i][1]=x;a[i][2]=y;a[i][0]=z; } tot=totot=0; tarjan(0); fo(i,1,m) if(color[a[i][2]]) { if(color[a[i][1]]==color[a[i][2]]) continue; int j=color[a[i][2]]; mn[j]=min(mn[j],a[i][0]); } else { int j=a[i][2]; mi[j]=min(mi[j],a[i][0]); } int ans=0; fo(i,1,n-1) ans+=(mi[i]==2139062143)?0:mi[i]; fo(i,1,totot) ans+=(mn[i]==2139062143)?0:mn[i]; printf("%d\n",ans); scanf("%d%d",&n,&m); }}
- 【NOIP2016提高A组8.12】通讯
- 【NOIP2016提高A组8.12】通讯
- 【NOIP2016提高A组8.12】通讯
- 通讯 【NOIP2016提高A组8.12】
- JZOJ4686. 【NOIP2016提高A组8.12】通讯
- JZOJ.4686. 【NOIP2016提高A组8.12】通讯
- JZOJ 4686 通讯【NOIP2016提高A组8.12】
- 【NOIP2016提高A组8.12】总结
- 【NOIP2016提高A组8.12】礼物
- 【NOIP2016提高A组8.12】奇袭
- 礼物 【NOIP2016提高A组8.12】
- 【NOIP2016提高A组8.12】礼物
- 【NOIP2016提高A组8.12】奇袭
- 4687. 【NOIP2016提高A组8.12】奇袭
- JZOJ.4685. 【NOIP2016提高A组8.12】礼物
- JZOJ 4685 礼物【NOIP2016提高A组8.12】
- [JZSC2016 Part 2]【NOIP2016提高A组模拟8.12】总结
- JZOJ 4687 奇袭【NOIP2016提高A组8.12】
- jQuery DataTables v1.9
- JDBC中Statement和PrepareStatement的区别及特性
- JSP介绍
- Android屏蔽EditTex获得焦点
- sqlite数据库学习1
- 【NOIP2016提高A组8.12】通讯
- 测试
- TCPView
- Android 遇坑总结
- Linux-必须熟悉的常用命令集
- jzoj 2544. 【NOIP2011模拟9.3】作弊的发牌者
- android里TextView加下划线
- zookeeper 入门讲解实例 转
- oracle cast multiset table 语法演示