第一问直接把可以走的边连起来bfs一遍即可

第二问可以用类似kruskal的方法,只不过排序的依据应该变为第一关键字为终点高度(从大到小),第二关键字为边权(从小到大),只排序可以走的边

因为同样高度的点之间的边是双向边,所以同一个高度的所有点构成了一个强连通分量,考虑终点在这个强连通分量的所有边,要么是在这个强连通分量中,要么是从更高处过来的边,我们处理这两种边都可以把它们当成无向边,也就是直接套用kruskal

#include<stdio.h>
#include<algorithm>
using namespace std;
struct edge{
	int x,y,v;
	edge(int a=0,int b=0,int c=0){x=a;y=b;v=c;}
}e[2000010];
int hi[100010],h[100010],to[2000010],nex[2000010],q[2000010],fa[100010],M;
bool v[100010];
int get(int x){return(fa[x]==x)?x:(fa[x]=get(fa[x]));}
void add(int a,int b,int c){
	M++;
	to[M]=b;
	nex[M]=h[a];
	h[a]=M;
	e[M]=edge(a,b,c);
}
bool cmp(edge a,edge b){return(hi[a.y]==hi[b.y])?(a.v<b.v):(hi[a.y]>hi[b.y]);}
int main(){
	int n,m,i,x,y,z,head,tail;
	long long ans;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)scanf("%d",hi+i);
	for(i=1;i<=m;i++){
		scanf("%d%d%d",&x,&y,&z);
		if(hi[x]>=hi[y])add(x,y,z);
		if(hi[x]<=hi[y])add(y,x,z);
	}
	head=tail=1;
	q[1]=1;
	while(head<=tail){
		x=q[head];
		head++;
		v[x]=1;
		for(i=h[x];i;i=nex[i]){
			if(!v[to[i]]){
				tail++;
				q[tail]=to[i];
			}
		}
	}
	x=0;
	for(i=1;i<=n;i++)x+=v[i];
	printf("%d\n",x);
	for(i=1;i<=n;i++)fa[i]=i;
	sort(e+1,e+M+1,cmp);
	ans=0;
	for(i=1;i<=M;i++){
		if(!v[e[i].x]||!v[e[i].y])continue;
		x=get(e[i].x);
		y=get(e[i].y);
		if(x!=y){
			fa[x]=y;
			ans+=e[i].v;
		}
	}
	printf("%lld",ans);
}

[BZOJ2753]滑雪与时间胶囊的更多相关文章

  1. BZOJ2753 SCOI2012 滑雪与时间胶囊 【最小生成树】*

    BZOJ2753 SCOI2012 滑雪与时间胶囊 Description a180285非常喜欢滑雪.他来到一座雪山,这里分布着M条供滑行的轨道和N个轨道之间的交点(同时也是景点),而且每个景点都有 ...

  2. Bzoj2753 [SCOI2012]滑雪与时间胶囊

    2753: [SCOI2012]滑雪与时间胶囊 Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 2282  Solved: 796 Descriptio ...

  3. 【BZOJ】【2753】【SCOI2012】滑雪与时间胶囊

    Kruskal/最小树形图 然而蒟蒻并不会做这题>_> 本来以为是有向图最小生成树,即最小树形图,但这数据范围有点…… 膜拜了zyf的题解:http://www.cnblogs.com/z ...

  4. BZOJ 2753 [SCOI2012] 滑雪和时间胶囊 最小生成树

    题目链接: 题目 2753: [SCOI2012]滑雪与时间胶囊 Time Limit: 50 Sec Memory Limit: 128 MB 问题描述 a180285非常喜欢滑雪.他来到一座雪山, ...

  5. bzoj 2753: [SCOI2012]滑雪与时间胶囊 -- 最小生成树

    2753: [SCOI2012]滑雪与时间胶囊 Time Limit: 50 Sec  Memory Limit: 128 MB Description a180285非常喜欢滑雪.他来到一座雪山,这 ...

  6. CDOJ 42/BZOJ 2753 滑雪与时间胶囊 kruskal

    2753: [SCOI2012]滑雪与时间胶囊 Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 1376  Solved: 487[Submit][St ...

  7. 【BZOJ 2753】 2753: [SCOI2012]滑雪与时间胶囊 (分层最小树形图,MST)

    2753: [SCOI2012]滑雪与时间胶囊 Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 2457  Solved: 859 Descriptio ...

  8. 2753: [SCOI2012]滑雪与时间胶囊

    2753: [SCOI2012]滑雪与时间胶囊 Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 2633  Solved: 910 Descriptio ...

  9. 【最小树形图(奇怪的kruskal)】【SCOI 2012】【bzoj 2753】滑雪与时间胶囊

    2753: [SCOI2012]滑雪与时间胶囊 Time Limit: 50 Sec Memory Limit: 128 MB Submit: 1621 Solved: 570 Description ...

随机推荐

  1. 线段树模板 CDOJ1057

    UESTCOJ不知道为什么进不去了哇 跟着叉姐的算法讲堂写的板子 叉姐的思路真的好清晰啊,一定是练习的多并且理解的够深了 希望自己也可以每天进步一点点吧 代码: #include <map> ...

  2. bzoj Gty的超级妹子树 块状树

    Gty的超级妹子树 Time Limit: 7 Sec  Memory Limit: 32 MBSubmit: 500  Solved: 122[Submit][Status][Discuss] De ...

  3. C#三层中的分页

    最近写了一个winform的管理系统,里面的分页同学推荐了几种,感觉都不好用,比较麻烦,自己就找了一个比较简单的分页,利用数据存储过程来分页. reate proc usp_User@pageInde ...

  4. C++ 智能指针的简单实现

    智能指针的用处:在c++中,使用普通指针容易造成堆内存的泄露问题,即程序员会忘记释放,以及二次释放,程序发生异常时内存泄漏等问题,而使用智能指针可以更好的管理堆内存.注意,在这里智能指针是一个类而非真 ...

  5. openlayers3中应用proj4js

    要在openlayers3中应用proj4js,需要在html中引用proj4js,然后在引用所需要的projection的js定义,如 http://epsg.io/21781-1753.js 然后 ...

  6. 51 Nod 1013 3的幂的和 矩阵链乘法||逆元+快速幂

    这道题我写了两种写法 一种利用逆元 a/b%mod=a*c%mod; (c是b的逆元)易得2的逆元就是5~~~04: 一种是矩阵快速幂 利用递推式得出结论 #include<cstdio> ...

  7. react框架

    react 其实react=vue, 区别:vue-  双向数据绑定, react  单向数据绑定. 中文文档:https://react.docschina.org/ 第一步:安装方式,不能直接引入 ...

  8. 创建第一个maven项目的那些坑

    1.记事本方式: class所在的目录结构: class的代码书写: package com.imooc.maven01.mode1; public class HelloWorld { public ...

  9. 【洛谷】xht模拟赛 题解

    前言 大家期待已久并没有的题解终于来啦~ 这次的T1和HAOI2016撞题了...深表歉意...表示自己真的不知情... 天下的水题总是水得相似,神题各有各的神法.--<安娜·卡列妮娜> ...

  10. 如何修改linux 的SSH的默认端口号?

    http://blog.chinaunix.net/uid-7551698-id-1989086.html   在安装完毕linux,默认的情况下ssh是开放的,容易受到黑客攻击,简单,有效的操作之一 ...