【BZOJ】【2753】【SCOI2012】滑雪与时间胶囊
Kruskal/最小树形图
然而蒟蒻并不会做这题>_>
本来以为是有向图最小生成树,即最小树形图,但这数据范围有点……
膜拜了zyf的题解:http://www.cnblogs.com/zyfzyf/p/4004236.html
题解:(摘自声亦香)因为只能从高处到低处,所以无向边可以当有向边看待,然后按照题目意思就是给你一个有向图,求一个最小树形图,然后如果你用朱刘算法来算,就只能得到70分。这道题具有与其余最小树形图不一样的地方:点有高度!难道高度只是拿来转化为有向边吗?当然不是。 回想kruskal为什么不能求最小树形图?因为每次找的最小边是有向的,所以算法完成之后不能保证根可以到儿子,有可能有反向边!但是这道题的反向边只会在高度相同的点之间出现。如果把边先按终点高度排序为第一关键字,边长为第二关键字排序之后,就会保证优先到高点,同高点之间选小边,然后就不会出现反向的情况,所以可以用kruskal实现用O(mlog(m))的时间复杂度解决这道题。
- /**************************************************************
- Problem: 2753
- User: Tunix
- Language: C++
- Result: Accepted
- Time:6548 ms
- Memory:61920 kb
- ****************************************************************/
- //BZOJ 2753
- #include<vector>
- #include<cstdio>
- #include<cstring>
- #include<cstdlib>
- #include<iostream>
- #include<algorithm>
- #define rep(i,n) for(int i=0;i<n;++i)
- #define F(i,j,n) for(int i=j;i<=n;++i)
- #define D(i,j,n) for(int i=j;i>=n;--i)
- #define pb push_back
- using namespace std;
- inline int getint(){
- int v=,sign=; char ch=getchar();
- while(ch<''||ch>''){ if (ch=='-') sign=-; ch=getchar();}
- while(ch>=''&&ch<=''){ v=v*+ch-''; ch=getchar();}
- return v*sign;
- }
- const int N=1e5+,M=1e6+,INF=~0u>>;
- typedef long long LL;
- /******************tamplate*********************/
- int head[N],next[M<<],to[M<<],cnt;
- void ins(int x,int y){
- to[++cnt]=y; next[cnt]=head[x]; head[x]=cnt;
- }
- int n,m;
- int h[N],d[N],a[M],b[M],w[M];
- int Q[N];
- bool vis[N];
- void bfs(){
- int l=,r=;
- Q[++r]=;
- vis[]=;
- while(l<=r){
- int x=Q[l++];
- for(int i=head[x];i;i=next[i])
- if (!vis[to[i]]){
- vis[to[i]]=;
- Q[++r]=to[i];
- }
- }
- printf("%d ",r);
- }
- struct edge{
- int x,y;
- LL v;
- }E[M<<];
- bool cmp(edge a,edge b){
- return h[a.y]>h[b.y] || (h[a.y]==h[b.y] && a.v<b.v);
- }
- int f[N];
- int Find(int x){return x==f[x] ? x : f[x]=Find(f[x]);}
- void kruskal(){
- int tot=;
- F(i,,m)
- if (vis[a[i]] && vis[b[i]]){
- if (h[a[i]]>=h[b[i]]) E[++tot]=(edge){a[i],b[i],w[i]};
- if (h[b[i]]>=h[a[i]]) E[++tot]=(edge){b[i],a[i],w[i]};
- }
- F(i,,n) f[i]=i;
- sort(E+,E+tot+,cmp);
- LL ans=;
- F(i,,tot){
- int f1=Find(E[i].x),f2=Find(E[i].y);
- if (f1!=f2){
- f[f2]=f1;
- ans+=E[i].v;
- }
- }
- printf("%lld\n",ans);
- }
- int main(){
- #ifndef ONLINE_JUDGE
- freopen("2753.in","r",stdin);
- freopen("2753.out","w",stdout);
- #endif
- n=getint(); m=getint();
- F(i,,n) h[i]=getint();
- F(i,,m){
- a[i]=getint(); b[i]=getint(); w[i]=getint();
- if (h[a[i]]>=h[b[i]]) ins(a[i],b[i]);
- if (h[a[i]]<=h[b[i]]) ins(b[i],a[i]);
- }
- bfs();
- kruskal();
- return ;
- }
2753: [SCOI2012]滑雪与时间胶囊
Time Limit: 50 Sec Memory Limit: 128 MB
Submit: 1521 Solved: 534
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
3 2 1
1 2 1
2 3 1
1 3 10
Sample Output
HINT
【数据范围】
对于30%的数据,保证 1<=N<=2000
对于100%的数据,保证 1<=N<=100000
对于所有的数据,保证 1<=M<=1000000,1<=Hi<=1000000000,1<=Ki<=1000000000。
Source
【BZOJ】【2753】【SCOI2012】滑雪与时间胶囊的更多相关文章
- BZOJ 2753 [SCOI2012] 滑雪和时间胶囊 最小生成树
题目链接: 题目 2753: [SCOI2012]滑雪与时间胶囊 Time Limit: 50 Sec Memory Limit: 128 MB 问题描述 a180285非常喜欢滑雪.他来到一座雪山, ...
- bzoj 2753: [SCOI2012]滑雪与时间胶囊 -- 最小生成树
2753: [SCOI2012]滑雪与时间胶囊 Time Limit: 50 Sec Memory Limit: 128 MB Description a180285非常喜欢滑雪.他来到一座雪山,这 ...
- bzoj 2753: [SCOI2012] 滑雪与时间胶囊 Label:MST
题目描述 a180285非常喜欢滑雪.他来到一座雪山,这里分布着M条供滑行的轨道和N个轨道之间的交点(同时也是景点),而且每个景点都有一编号i(1<=i<=N)和一高度Hi.a180285 ...
- bzoj 2753: [SCOI2012]滑雪与时间胶囊
Description a180285非常喜欢滑雪.他来到一座雪山,这里分布着M条供滑行的轨道和N个轨道之间的交点(同时也是景点),而且每个景点都有一编号i(1<=i<=N)和一高度Hi. ...
- 【刷题】BZOJ 2753 [SCOI2012]滑雪与时间胶囊
Description a180285非常喜欢滑雪.他来到一座雪山,这里分布着M条供滑行的轨道和N个轨道之间的交点(同时也是景点),而且每个景点都有一编号i(1<=i<=N)和一高度Hi. ...
- 【BZOJ 2753】 2753: [SCOI2012]滑雪与时间胶囊 (分层最小树形图,MST)
2753: [SCOI2012]滑雪与时间胶囊 Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 2457 Solved: 859 Descriptio ...
- 2753: [SCOI2012]滑雪与时间胶囊
2753: [SCOI2012]滑雪与时间胶囊 Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 2633 Solved: 910 Descriptio ...
- 【最小树形图(奇怪的kruskal)】【SCOI 2012】【bzoj 2753】滑雪与时间胶囊
2753: [SCOI2012]滑雪与时间胶囊 Time Limit: 50 Sec Memory Limit: 128 MB Submit: 1621 Solved: 570 Description ...
- Bzoj2753 [SCOI2012]滑雪与时间胶囊
2753: [SCOI2012]滑雪与时间胶囊 Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 2282 Solved: 796 Descriptio ...
- BZOJ2753 SCOI2012 滑雪与时间胶囊 【最小生成树】*
BZOJ2753 SCOI2012 滑雪与时间胶囊 Description a180285非常喜欢滑雪.他来到一座雪山,这里分布着M条供滑行的轨道和N个轨道之间的交点(同时也是景点),而且每个景点都有 ...
随机推荐
- centos查看设置端口开放状态
centos查看端口是否已开放/etc/init.d/iptables status centos开放端口/sbin/iptables -I INPUT -p tcp --dport 8000 -j ...
- php 获取文件后缀名
$file_ext = strtolower(substr(strrchr($upload_file, '.'), 1)); strrchr:查找指定字符在字符串中的最后一次出现 string str ...
- 【转】DCC32的参数详解
完整的内容如下: // DCC32编译器的设置说明. // Dcc32 [options] filename [options] // DCC32 [操作选项] 文件名称 [操作选项] // -A&l ...
- [.ashx檔?泛型处理例程?]基础入门#3....ADO.NET 与 将DB里面的二进制图片还原
原文出處 http://www.dotblogs.com.tw/mis2000lab/archive/2013/08/20/ashx_beginner_03_db_picture_show.aspx ...
- mongodb 3.2存储目录结构说明
[root@hadoop1 mongodb]# tree ./data ./data |-- WiredTiger | |-- WiredTiger.lock | |-- WiredTiger.tur ...
- STM32F0xx_ADC采集电压配置详细过程
前言 关于ADC这一块的功能基本上也算是CortexM芯片的标配了.ST的每一块芯片都有这个功能,只是说因型号不同,通道数.位数等有所不同.STM8的芯片大多数都是10的,也就是说分辨率可达到:参考电 ...
- 改用二进制启动Moses translation model提示Can't read ~/working/binarised-model/reordering-table
解决方案: 换成 /home/用户名/working 貌似就好使了...但是时间还是估计太长,明早挂机一天试试,顺便把manual 的详细部分看了
- SQLserver查询数据库所有字段-表名
SELECT * FROM INFORMATION_SCHEMA.columns WHERE TABLE_NAME='Account' SELECT (case when a.colorder=1 t ...
- 【转】Oracle中如何用一条SQL快速生成10万条测试数据
转自http://blog.csdn.net/welken/article/details/4971887 做数据库开发或管理的人经常要创建大量的测试数据,动不动就需要上万条,如果一条一条的录入, ...
- hdu 1973 Prime Path
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1973 Prime Path Description The ministers of the cabi ...