BZOJ2753 SCOI2012day1T1滑雪与时间胶囊(bfs+kruskal)

 1 #include <queue>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <iostream>
 6 #include <algorithm>
 7 #define MaxN 100010
 8 #define MaxM 2000010
 9 #define LL long long 
10 using namespace std;
11 int S = 0, n, m;
12 int h[MaxN], head[MaxN], vis[MaxN], f[MaxN], q[MaxM];
13 struct rec{
14     int u, v, c, nxt;
15 }E[MaxM];
16 
17 void Bfs(){
18 //    memset(vis, 0, sizeof(vis));
19     int cl, op;
20     vis[1] = 1;
21     q[cl = op = 1] = 1;
22     while (cl <= op){
23         int u = q[cl];
24         for (int i = head[u]; i; i = E[i].nxt){
25             int v = E[i].v;
26             if (vis[v]) continue;
27             vis[v] = 1;
28             q[++op] = v;
29         }
30         cl++;
31     }
32 }
33 
34 bool cmp(rec a, rec b){
35     if (h[a.v] != h[b.v]) return h[a.v] > h[b.v];
36     return a.c < b.c;
37 } 
38 
39 int find(int x){
40     if (!f[x]) return x;
41     return f[x] = find(f[x]);
42 }
43 
44 LL Kruskal(){
45     int v, c, u, t1, t2;
46     LL t = 0ll;
47     sort(E+1, E+1+S, cmp);
48     for (int i = 1; i <= S; i++){
49         v = E[i].v, c = E[i].c, u = E[i].u;
50         if (!vis[v] || !vis[u]) continue;
51         t1 = find(u), t2 = find(v);
52         if (t1 == t2) continue;
53         f[t1] = t2;
54         t += (LL) c;
55     }
56     return t;
57 }
58 
59 void Solve(){
60     int ans = 0;
61 //    for (int j = 1; j <= n; j++)
62 //    for (int i = head[j]; i; i = E[i].nxt) cout<<E[i].u <<" "<<E[i].v<<" "<<E[i].c<<endl;
63     Bfs();
64     for (int i = 1; i <= n; i++) 
65         if (vis[i]) ans++;
66     cout<<ans <<" "<<Kruskal()<<endl;
67 }
68 
69 void adde(int u, int v, int c){
70     E[++S] = (rec) {u, v, c, head[u]};
71     head[u] = S;
72 }
73 
74 void Read_Data(){
75     scanf("%d%d", &n, &m);
76     memset(head, 0, sizeof(head));
77     for (int i = 1; i <= n; i++) scanf("%d", &h[i]);
78     for (int i = 1,u,v,c,t; i <= m; i++){
79         scanf("%d%d%d", &u, &v, &c);
80         if (h[v] > h[u]) t=u,u=v,v=t;
81         adde(u, v, c);
82         if (h[v] == h[u]) adde(v, u, c);
83     }
84 }
85 
86 int main(){
87     freopen("ski.in", "r", stdin);
88     freopen("ski.out", "w", stdout);
89     Read_Data();
90     Solve();
91     fclose(stdin);
92     fclose(stdout);    
93     return 0;
94 } 
原文地址:https://www.cnblogs.com/Lukaluka/p/5086637.html