zoukankan      html  css  js  c++  java
  • hdu3938 Portal 离线+并查集

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 using namespace std;
     5 
     6 int m, n, q;
     7 const int maxn = 50005;
     8 int fa[maxn];
     9 int Rank[maxn];
    10 
    11 void init(){
    12     for (int i = 1; i <= n; i++){
    13         Rank[i] = 1;
    14         fa[i] = i;
    15     }
    16 }
    17 
    18 struct  node
    19 {
    20     int u;    //路的前端
    21     int v;    //路的后端
    22     int l;    //成本
    23 }edge[maxn];
    24 
    25 struct Q
    26 {
    27     int l, id, ans;
    28 }que[maxn];
    29 
    30 bool cmp(node a, node b){
    31     return a.l < b.l;
    32 }
    33 
    34 bool cmp1(Q a, Q b){
    35     return a.l < b.l;    //从小到大排序
    36 }
    37 
    38 bool cmp2(Q a, Q b){
    39     return a.id < b.id;
    40 }
    41 
    42 int find(int x){
    43     if (x == fa[x])
    44         return x;
    45     return fa[x] = find(fa[x]);
    46 }
    47 
    48 int Set_Union(int x, int y){
    49     int fx = find(x);
    50     int fy = find(y);
    51     if (fx == fy)
    52         return 0;
    53     fa[fy] = fx;
    54     int t = Rank[fx];
    55     Rank[fx] = Rank[fx] + Rank[fy];
    56     return t*Rank[fy];
    57 }
    58 
    59 int main(){
    60     while (~scanf("%d%d%d", & n, &m, &q)){
    61         init();
    62         que[0].ans = 0;
    63         for (int i = 1; i <= m; i++){
    64             scanf("%d%d%d", &edge[i].v, &edge[i].u, &edge[i].l);
    65         }
    66         for (int i = 1; i <= q; i++){
    67             scanf("%d", &que[i].l);
    68             que[i].id = i;
    69             que[i].ans = 0;
    70         }
    71         sort(edge + 1,edge + 1 + m, cmp);
    72         sort(que + 1, que + 1 + q, cmp1);
    73         int cur = 1;
    74         for (int i = 1; i <= q; i++){
    75             que[i].ans = que[i - 1].ans;
    76             while (edge[cur].l <= que[i].l&&cur <= m){
    77                 que[i].ans += Set_Union(edge[cur].u, edge[cur].v);
    78                 cur++;
    79             }
    80         }
    81         sort(que + 1, que + 1 + q, cmp2);
    82         for (int i = 1; i <= q; i++){
    83             printf("%d
    ", que[i].ans);
    84         }
    85 
    86     }
    87     //system("pause");
    88     return 0;
    89 }
  • 相关阅读:
    HDU 1051 Wooden Sticks (贪心)
    PHP中递归函数的一个常见逻辑问题
    【Android界面实现】使用Canvas对象实现“刮刮乐”效果
    vue2.0
    vuex3
    nodejs中require的路径是一个文件夹时发生了什么
    vue2
    vuex
    echarts
    node21---mongoose
  • 原文地址:https://www.cnblogs.com/ouyang_wsgwz/p/7492026.html
Copyright © 2011-2022 走看看