zoukankan      html  css  js  c++  java
  • hdu 5441 并查集

    Travel

    Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 2331    Accepted Submission(s): 804

    Problem Description
    Jack likes to travel around the world, but he doesn’t like to wait. Now, he is traveling in the Undirected Kingdom. There are n
    cities and m
    bidirectional roads connecting the cities. Jack hates waiting too long on the bus, but he can rest at every city. Jack can only stand staying on the bus for a limited time and will go berserk after that. Assuming you know the time it takes to go from one city to another and that the time Jack can stand staying on a bus is x
    minutes, how many pairs of city (a,b)
    are there that Jack can travel from city a
    to b
    without going berserk?
     
    Input
    The first line contains one integer T,T5
    , which represents the number of test case.
    For each test case, the first line consists of three integers n,m
    and q
    where n20000,m100000,q5000
    . The Undirected Kingdom has n
    cities and m
    bidirectional roads, and there are q
    queries.
    Each of the following m
    lines consists of three integers a,b
    and d
    where a,b{1,...,n}
    and d100000
    . It takes Jack d
    minutes to travel from city a
    to city b
    and vice versa.
    Then q
    lines follow. Each of them is a query consisting of an integer x
    where x
    is the time limit before Jack goes berserk.
     
    Output
    You should print q
    lines for each test case. Each of them contains one integer as the number of pair of cities (a,b)
    which Jack may travel from a
    to b
    within the time limit x
    .
    Note that (a,b)
    and (b,a)
    are counted as different pairs and a
    and b
    must be different cities.
     
    Sample Input
    1 5 5 3 2 3 6334 1 5 15724 3 5 5705 4 3 12382 1 3 21726 6000 10000 13000
     
    Sample Output
    2 6 12
     
    Source
     
     
     
    其实这道题 队里之前讲过的 一直没有写...gg
    一直TLE 然后学习了离线并查集 先排序 一边扫 一边存  还有计算几对的姿势也不好  he+=mp[ss]*mp[ee]
    然后 然后 按着这个敲了还是超时 gg  太菜比了  并查集 以为了解的很深了
    如下正解
    int Find(int mubiao)
    {
        if(parent[mubiao]!=mubiao)
            parent[mubiao]=Find(parent[mubiao]);//原来的姿势一直有bug
        return parent[mubiao];
    }
     
     
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    int t;
    int n,m,q;
    struct  path
    {
        int s;
        int e;
        int dis;
         bool operator <(const path &x)const{
          return dis<x.dis;
         }
    }P[100005];
    struct limi
    {
        int id;
        int limit;
        bool operator <(const limi &x)const{
          return limit<x.limit;
         }
    }L[100005];
    __int64 re[5005];
    int parent[20005];
    int mp[20005];
    int Find(int mubiao)
    {
        if(parent[mubiao]!=mubiao)
            parent[mubiao]=Find(parent[mubiao]);
        return parent[mubiao];
    }
    void init()
    {
        for(int j=1;j<=n;j++)
        {
            parent[j]=j;
            mp[j]=1;
        }
        memset(re,0,sizeof(re));
    }
    int main()
    {
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%d%d",&n,&m,&q);
            for(int i=0;i<m;i++)
                scanf("%d%d%d",&P[i].s,&P[i].e,&P[i].dis);
            sort(P,P+m);
            for(int i=0;i<q;i++)
            {
                L[i].id=i;
                scanf("%d",&L[i].limit);
            }
            sort(L,L+q);
            init();
            int gg=0;
            __int64 he=0;
            for(int i=0;i<q;i++)
            {
                while(gg<m&&L[i].limit>=P[gg].dis)
                {
                    int ss=Find(P[gg].s);
                    int ee=Find(P[gg].e);
                    if(ss!=ee)
                    {
                        he+=mp[ss]*mp[ee];
                        parent[ee]=ss;
                        mp[ss]+=mp[ee];
                    }
                    gg++;
                }
                re[L[i].id]=he;
            }
            for(int i=0;i<q;i++)
                printf("%I64d
    ",2*re[i]);
    }
    return 0;
    }
    
  • 相关阅读:
    PHPCMS V9 导航栏当前栏目高亮
    phpcms v9栏目列表调用每一篇文章内容方法
    PHPCMS V9 为今天或几天前文章加new
    vue.js路由参数简单实例讲解------简单易懂
    vue组件知识总结
    vue.js 利用组件之间通讯,写一个弹出框例子
    vue.js组件之间通讯--父组件调用子组件的一些方法,子组件暴露一些方法,让父组件调用
    vue.js组件之间的通讯-----父亲向儿子传递数据,儿子接收父亲的数据
    vue.js通讯----父亲拿儿子的数据
    git常见操作---由简入深
  • 原文地址:https://www.cnblogs.com/hsd-/p/4924673.html
Copyright © 2011-2022 走看看