zoukankan      html  css  js  c++  java
  • 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 } 
  • 相关阅读:
    [转]如何才能在 IIS 7.5 使用 Windows PowerShell SnapIn 功能
    VS2010 生成序列图实例
    Jquery Ajax调用asmx出错问题
    [转载]通过HttpWebRequest在后台对WebService进行调用
    手机网站自适应
    sqlserver内存释放
    程序集强命名的作用
    MVP,MVVM,MVC
    浮点类型的特殊性知多少
    Directly querying the BizTalk database for suspended messages
  • 原文地址:https://www.cnblogs.com/Lukaluka/p/5086637.html
Copyright © 2011-2022 走看看