【题解】Luogu P2573 [SCOI2012] 滑雪 最小生成树

并查集写错少find了导致一直MLE。。。

dfs+kruskal

因为时间胶囊无限,所以相当于回溯回祖先节点再向下dfs

先dfs一遍看最多能滑多少点,能滑到的点连边

用这些新的边跑最小生成树,排序的时候先按高度从大到小再按边权从小到大

code

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 namespace gengyf{
 4 const int maxn=1e5+5;
 5 #define int long long
 6 inline int read(){
 7     int x=0,f=1;char s=getchar();
 8     while(s<‘0‘||s>‘9‘){if(s==‘-‘)f=-1;s=getchar();}
 9     while(s>=‘0‘&&s<=‘9‘){x=x*10+s-‘0‘;s=getchar();}
10     return f*x;
11 }
12 int n,m,h[maxn],sum=1,tot,ans;
13 struct Edge{
14     int u,v,w;
15 }E[maxn*20];
16 struct edge{
17     int nxt,to,w;
18 }e[maxn*20];
19 int head[maxn],cnt,fa[maxn];
20 bool vis[maxn];
21 inline void add(int from,int to,int w){
22     e[++cnt].to=to;e[cnt].w=w;e[cnt].nxt=head[from];head[from]=cnt;
23 }
24 void dfs(int x){
25     for(int i=head[x];i;i=e[i].nxt){
26         int to=e[i].to;
27         E[++tot].u=x;E[tot].v=to;E[tot].w=e[i].w;
28         if(!vis[to]){
29             vis[to]=1;sum++;dfs(to);
30         }
31     }
32 }
33 bool cmp(Edge a,Edge b){
34     return h[a.v]==h[b.v]?a.w<b.w:h[a.v]>h[b.v];
35 }
36 int find(int x){
37     return x==fa[x]?x:fa[x]=find(fa[x]);
38 }
39 int main(){
40     n=read();m=read();
41     for(int i=1;i<=n;i++){
42         h[i]=read();fa[i]=i;
43     }
44     for(int i=1;i<=m;i++){
45         int u,v,w;
46         u=read();v=read();w=read();
47         if(h[u]==h[v]){
48             add(u,v,w);add(v,u,w);
49         }
50         else if(h[u]>h[v])add(u,v,w);
51         else add(v,u,w);
52     }
53     vis[1]=1;dfs(1);
54     sort(E+1,E+1+tot,cmp);
55     int k=0;
56     for(int i=1;i<=tot;i++){
57         int u=find(E[i].u),v=find(E[i].v);
58         if(u!=v){
59             fa[u]=v;
60             ans+=E[i].w;k++;
61         }
62         if(k==sum-1)break;
63     }
64     printf("%lld %lld",sum,ans);
65     return 0;
66 }
67 /*
68  acquisition 得到
69  adapt 适应
70  adequate 足够的
71 */
72 }
73 signed main(){
74     gengyf::main();
75     return 0;
76 }

忽略后面的单词(雾

原文地址:https://www.cnblogs.com/gengyf/p/11739154.html

时间: 2024-10-07 18:57:30

【题解】Luogu P2573 [SCOI2012] 滑雪 最小生成树的相关文章

洛谷 P2573 [SCOI2012]滑雪

题目描述 a180285非常喜欢滑雪.他来到一座雪山,这里分布着M条供滑行的轨道和N个轨道之间的交点(同时也是景点),而且每个景点都有一编号i(1<=i<=N)和一高度Hi.a180285能从景点i 滑到景点j 当且仅当存在一条i 和j 之间的边,且i 的高度不小于j. 与其他滑雪爱好者不同,a180285喜欢用最短的滑行路径去访问尽量多的景点.如果仅仅访问一条路径上的景点,他会觉得数量太少.于是a180285拿出了他随身携带的时间胶囊.这是一种很神奇的药物,吃下之后可以立即回到上个经过的景点

P2573 [SCOI2012]滑雪

题目链接 在题中每个点都有一个限制条件,对于一个点,只能通向高度低于它的点,所以我们可以对题目中的所有点建有向图.然后可以从1开始通过bfs找到所有可以通向的点. 找到了这些点过后又怎么办呢?题目中说要使得经过最多景点数的点的边权值最小.所以我们能够在bfs的同时将这些能够到达的点都建一个新的图.然后从1开始在这个新图上跑:kruskal即可求出最小的权值. 代码如下: #include<bits/stdc++.h> using namespace std; const int maxn=1e

[SCOI2012]滑雪与时间胶囊

2753: [SCOI2012]滑雪与时间胶囊 Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 2362  Solved: 821[Submit][Status][Discuss] Description a180285非常喜欢滑雪.他来到一座雪山,这里分布着M条供滑行的轨道和N个轨道之间的交点(同时也是景点),而且每个景点都有一编号i(1<=i<=N)和一高度Hi.a180285能从景点i 滑到景点j 当且仅当存在一条i 和j 之间的边,且i

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

2753: [SCOI2012]滑雪与时间胶囊 Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 2633  Solved: 910 Description a180285非常喜欢滑雪.他来到一座雪山,这里分布着M条供滑行的轨道和N个轨道之间的交点(同时也是景点),而且每个景点都有一编号i(1<=i<=N)和一高度Hi.a180285能从景点i 滑到景点j 当且仅当存在一条i 和j 之间的边,且i 的高度不小于j. 与其他滑雪爱好者不同,a1802

[BZOJ 2753][SCOI2012]滑雪与时间胶囊

Description a180285非常喜欢滑雪.他来到一座雪山,这里分布着M条供滑行的轨道和N个轨道之间的交点(同时也是景点),而且每个景点都有一编号i(1<=i<=N)和一高度Hi.a180285能从景点i 滑到景点j 当且仅当存在一条i 和j 之间的边,且i 的高度不小于j. 与其他滑雪爱好者不同,a180285喜欢用最短的滑行路径去访问尽量多的景点.如果仅仅访问一条路径上的景点,他会觉得数量太少.于是a180285拿出了他随身携带的时间胶囊.这是一种很神奇的药物,吃下之后可以立即回到

题解 luogu P1850 【换教室】

题解 luogu P1850 [换教室] 时间:2019.8.6 一晚上(约 3.5h 写完) 题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 \(2n\) 节课程安排在 \(n\) 个时间段上.在第 \(i\)(\(1 \leq i \leq n\))个时间段上,两节内容相同的课程同时在不同的地点进行,其中,牛牛预先被安排在教室 \(c_i\) 上课,而另一节课程在教室 \(d_i\) 进行. 在不提交任何申请的情况下,学生们需要

题解 luogu P5021 【赛道修建】

题解 luogu P5021 [赛道修建] 时间:2019.8.9 20:40 时间:2019.8.12 题目描述 C 城将要举办一系列的赛车比赛.在比赛前,需要在城内修建 \(m\) 条赛道. C 城一共有 \(n\) 个路口,这些路口编号为 \(1,2,\dots,n\),有 \(n-1\) 条适合于修建赛道的双向通行的道路,每条道路连接着两个路口.其中,第 \(i\) 条道路连接的两个路口编号为 \(a_i\) 和 \(b_i\),该道路的长度为 \(l_i\).借助这 \(n-1\) 条

bzoj2753[SCOI2012]滑雪与时间胶囊 最小生成树

Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 2843  Solved: 993[Submit][Status][Discuss] Description a180285非常喜欢滑雪.他来到一座雪山,这里分布着M条供滑行的轨道和N个轨道之间的交点(同时也是景点),而且每个景点都有一编号i(1<=i<=N)和一高度Hi.a180285能从景点i 滑到景点j 当且仅当存在一条i 和j 之间的边,且i 的高度不小于j. 与其他滑雪爱好者不同,a180

bzoj 2753: [SCOI2012] 滑雪与时间胶囊 Label:MST

题目描述 a180285非常喜欢滑雪.他来到一座雪山,这里分布着M条供滑行的轨道和N个轨道之间的交点(同时也是景点),而且每个景点都有一编号i(1<=i<=N)和一高度Hi.a180285能从景点i 滑到景点j 当且仅当存在一条i 和j 之间的边,且i 的高度不小于j. 与其他滑雪爱好者不同,a180285喜欢用最短的滑行路径去访问尽量多的景点.如果仅仅访问一条路径上的景点,他会觉得数量太少.于是a180285拿出了他随身携带的时间胶囊.这是一种很神奇的药物,吃下之后可以立即回到上个经过的景点