Travel

Time Limit:1000MS     Memory Limit:131072KB     64bit IO Format:%I64d & %I64u

/*
题意
给出n【节点数】,m【连线数】,q【查询次数】;
输入m组数据 u【起点】,v【终点】,cost【权值】; (u,v)和 (v,u)表示两种不同的连线
输入q组查询数据; 要求
输出在m组数据中所有cost<q的所有节点连线的连线方式个数。 注意:每个拥有n个节点的联通块有 n*(n-1)个联通分量 (连线数);
每次两个联通块相连总连线数应该是(n1+n2)*(n1+n2-1);
用一个数据来记录的话更新方式应该为 n-n1*(n1-1)-n2*(n2-1)+(n1+n2)*(n1+n2-1);
*/ //如果每一次都重新建立并查集,查询数q比较大的话肯定会超时的,看了别人博客说用离线思维;稍稍了解了一下啥叫离线思维。 //本题用离线思想,将查询按照X的大小升序排序,后面的查询就在前一步往后进行,复杂度减小很多

/*
神测试数据。。。。。【 T。T 】
1
5 5 12
2 3 6334
1 5 15724
3 5 5705
4 3 12382
1 3 21726
6333
6334
6335
12345
12381
12385
13000
233
5777
21726
21727
21725

*/

//AC代码:
#include"iostream"
#include"cstdio"
#include"cstring"
#include"cmath"
#include"algorithm"
using namespace std;
const int MX=2222222;
long long ans[MX];
int P[MX], num[MX]; struct node {
int u, v, cost;
} side[MX]; bool cmp_side(node a,node b) {
return a.cost < b.cost;
} struct Que {
int id, x; //id 记录输入时候的顺序 x记录查询值
} Q[MX]; bool cmp_que(Que a,Que b) {
return a.x<b.x;
} int find(int x) {
return P[x]==x?x:(P[x]=find(P[x]));
} int main() {
int T;
scanf("%d", &T);
while(T--) {
int n, m, q;
scanf("%d%d%d", &n, &m, &q);
for(int i=1; i<=n; i++) {
P[i]=i;
num[i]=1; //初始化连通分量
}
for(int i=1; i<=m; i++) { //把无向边加入队列
scanf("%d%d%d", &side[i].u, &side[i].v, &side[i].cost);
}
sort(side+1,side+m+1,cmp_side);//升序排序无向边
for(int i=1; i<=q; i++) { //添加查询队列
Q[i].id=i;
scanf("%d",&Q[i].x);
}
sort(Q+1,Q+q+1,cmp_que); //按照查询复杂度排序答案。
int k=1;
long long s=0;
for(int i=1; i<=m; i++) {
while(k<=q&&side[i].cost>Q[k].x)ans[Q[k++].id]=s; //把答案按照ID的顺序保存到ans数组中
int rt1=find(side[i].u),rt2=find(side[i].v);
if(rt1!=rt2) {
long long n1=num[rt1],n2=num[rt2];
//每个拥有n个节点的联通块有 n*(n-1)个联通分量 (对点)
s=s-n1*(n1-1)-n2 *(n2-1)+(n1+n2)*(n1+n2-1);//去掉两个根的联通量在加上总和的联通分量
P[rt1]=rt2;
num[rt2]+=num[rt1];//加上节点的数量
}
}
//ans[Q[k].id]=s; // 【这里居然看在上面读入ans之后还没有到最后一个,后面再测试数据才发现了这个问题。。。】
while(k<=q)
ans[Q[k++].id]=s;
for(int i=1; i<=q; i++)
printf("%I64d\n",ans[i]); //按照离线保存的实际查询顺序输出
}
return 0;
}

  

 

ACM : Travel-并查集-最小生成树 + 离线-解题报告的更多相关文章

  1. ACM数据结构-并查集

    ACM数据结构-并查集   并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合 ...

  2. 并查集 & 最小生成树详细讲解

    并查集 & 最小生成树 并查集 Disjoint Sets 什么是并查集?     并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将 ...

  3. ACM: 继续畅通工程-并查集-最小生成树-解题报告

    继续畅通工程 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Descri ...

  4. ACM: The Suspects-并查集-解题报告

    The Suspects Time Limit:1000MS Memory Limit:20000KB 64bit IO Format:%lld & %llu Description 严重急性 ...

  5. hdu 1863 畅通工程 (并查集+最小生成树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863 畅通工程 Time Limit: 1000/1000 MS (Java/Others)    M ...

  6. CodeForces892E 可撤销并查集/最小生成树

    http://codeforces.com/problemset/problem/892/E 题意:给出一个 n 个点 m 条边的无向图,每条边有边权,共 Q 次询问,每次给出 ki​ 条边,问这些边 ...

  7. CodeForces - 891C: Envy(可撤销的并查集&最小生成树)

    For a connected undirected weighted graph G, MST (minimum spanning tree) is a subgraph of G that con ...

  8. Travel 并查集

    题意:给一个图,若干询问,每次询问只经过边权<=w的边,x能到达的点数 并查集啊,对询问和边排序,直接合并,维护size,查询 #include<cstdio> #include&l ...

  9. acm专题--并查集

    题目来源:http://hihocoder.com/problemset/problem/1066 #1066 : 无间道之并查集 时间限制:20000ms 单点时限:1000ms 内存限制:256M ...

随机推荐

  1. 跳跃表Skip List的原理和实现

    >>二分查找和AVL树查找 二分查找要求元素可以随机访问,所以决定了需要把元素存储在连续内存.这样查找确实很快,但是插入和删除元素的时候,为了保证元素的有序性,就需要大量的移动元素了.如果 ...

  2. 傻瓜式十分钟免费开启 HTTPS,是时候为你的站点加上小绿锁了

    http://gold.xitu.io/entry/57df65690bd1d00057f9455b?from=singlemessage&isappinstalled=0 原文链接:http ...

  3. ASP.NET Web API 全局权限和全局异常处理

    在开发中,我使用json格式序列化,所以将默认的xml序列化移除 public static class WebApiConfig { public static void Register(Http ...

  4. MySQL5.6 on Windows 安装失败: String was not recognized as a valid DateTime

    在Win7,32位上安装MySQL5.6.21时出现日期/时间格式错误, 如下图所示: 错误描述为: String was not recognized as a valid DateTime. 下面 ...

  5. Unreal Engine4 学习笔记1 状态机 动画蓝图

    1.动画蓝图 包含 状态机 包含 混合空间BlendSpace,即状态机包含在动画蓝图的"动画图表中",而混合空间可用于在状态机中向某(没)一个状态输出最终POSE:    动画蓝 ...

  6. .NET Framework 4 与 .NET Framework 4 Client Profile

    今天碰到的一个问题和Client Profile相关的.问题是这样的:一个WPF工程,需要引用另外几个.NET的assembly, 在WPF工程中添加了对这几个assembly的引用,并在程序中可以添 ...

  7. 什么是好的API设计?(转)

    什么是API? 我们只要是在进行编程我们就需要不停的设计API. API简单来讲可以是一个调用的函数,一个接口. 抽象来说,接口是一个内聚系统暴漏给外部的一切信息,包含但不限于: 调用方式:比如通过l ...

  8. 【java】 获取计算机信息及Java信息

    获取计算机名称,操作系统信息,java信息 package com.agen.test1; import java.io.BufferedReader; import java.io.InputStr ...

  9. caffe安装(linux)

    从官网github下载caffe-master.zip 解压:unzip caffe-master 将Makefile.config.example复制,命名为Makefile.config(如果是C ...

  10. 深入剖析Java中的装箱和拆箱

    深入剖析Java中的装箱和拆箱 自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题.本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱 ...