HDU 3938 Portal

来源:互联网 发布:慕容安cos淘宝 编辑:程序博客网 时间:2024/06/06 18:43

离线并查集~~~


#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>#include <queue>#include <iostream>#include <algorithm>#include <functional>#define  inf 0x3f3f3f3f#define  INF 0x3f3f3f3f3f3f3f3fLLusing namespace std;const int MAXN = 10010;const int MAXM = 50010;const int MAXQ = 10010;struct Query{    int l, id;    Query() {}    Query(int t_l, int t_id) : l(t_l), id(t_id) {}    bool operator < (const Query &q) const    {        return l < q.l;    }}query[MAXQ];struct Edge{    int u, v, w;    Edge() {}    Edge(int t_u, int t_v, int t_w) : u(t_u), v(t_v), w(t_w) {}    bool operator < (const Edge &e) const    {        return w < e.w;    }}edge[MAXM];int ans[MAXN], parent[MAXN];int n, m, q;void init_set(){    memset(parent, -1, sizeof(parent));}int find_set(int u){    return parent[u] < 0 ? u : parent[u] = find_set(parent[u]);}void union_set(int u, int v){    int r1 = find_set(u), r2 = find_set(v);    if(r1 != r2)    {        if(parent[r2] < parent[r1])        {            parent[r2] += parent[r1];            parent[r1] = r2;        }        else        {            parent[r1] += parent[r2];            parent[r2] = r1;        }    }    return ;}int main(){    //freopen("aa.in", "r", stdin);    //freopen("bb.out", "w", stdout);    while(scanf("%d %d %d", &n, &m, &q) != EOF)    {        for(int i = 1; i <= m; ++i)        {            scanf("%d %d %d", &edge[i].u, &edge[i].v, &edge[i].w);        }        for(int i = 1; i <= q; ++i)        {            query[i].id = i;            scanf("%d", &query[i].l);        }        sort(edge + 1, edge + m + 1);        sort(query + 1, query + q + 1);        memset(ans, 0, sizeof(ans));        int j = 1; init_set();        for(int i = 1; i <= q; ++i)        {            ans[query[i].id] = ans[query[i-1].id];            while(edge[j].w <= query[i].l && j <= m)            {                int r1 = find_set(edge[j].u), r2 = find_set(edge[j].v);                if(r1 != r2)                {                    ans[query[i].id] += parent[r1] * parent[r2];                    union_set(edge[j].u, edge[j].v);                }                ++j;            }        }        for(int i = 1; i <= q; ++i)        {            printf("%d\n", ans[i]);        }    }    return 0;}


原创粉丝点击