http://acm.hdu.edu.cn/showproblem.php?pid=5441

题目大意是给一个n个城市(点)m条路线(边)的双向的路线图,每条路线有时间值(带权图),然后q个询问,每个询问一个时间值

求不大于这个时间的可以连通的城市有多少种连法

比如样例中第一个询问6000,不大于6000时间值的连通城市有3,5.所以有3-->5,5-->3两种

第二个询问10000,符合条件的连通的城市有2,3,5,所以有2-->3,3-->2,2-->5,5-->2,3-->5,5-->3六种

利用结构体储存点与权值然后把权值排序,找出符合条件的城市点,利用并查集记录相连的点然后合并,整合路线

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int father[],num[];
int a[];
void lsy(int n)
{
for (int i=;i<=n;i++)
{
father[i]=i;
num[i]=;
}
}
struct point {
int x,y,z;
bool operator <(const point& q)const
{
return z<q.z;
}
};
point yj[];
struct node {
int w,id;
bool operator <(const node &q)const
{
return w<q.w;
}
};
node yjj[];
int _find(int x)
{
if (father[x]==x)return x;
father[x]=_find(father[x]);
return father[x];
}
int main()
{
int t,n,m,q,i;
while (~scanf("%d",&t))
{
while (t--)
{
scanf("%d %d %d",&n,&m,&q);
memset(a,,sizeof(a));
for (i=;i<=m;i++)
scanf("%d %d %d",&yj[i].x,&yj[i].y,&yj[i].z);
sort(yj+,yj+m+);
lsy(n);
for (i=;i<=q;i++)
{
scanf("%d",&yjj[i].w);
yjj[i].id=i;
}
sort(yjj+,yjj+q+);
int ans=,j=;
for (i =;i<=q;i++)
{
while (j<=m&&yj[j].z<=yjj[i].w )
{
int sx=_find(yj[j].x);
int sy=_find(yj[j].y);
j++;
if (sx==sy) continue;
ans+=(num[sx]+num[sy])*(num[sx]+num[sy]-)-num[sx]*(num[sx]-) - num[sy]*(num[sy]-);//合并之后的关系
father[sx]=sy;
num[sy]+=num[sx];
}
a[yjj[i].id]=ans;
}
for (i=;i<=q;i++)
printf("%d\n",a[i]);
}
}
return ;
}

hdu 5441 Travel (2015长春网赛)的更多相关文章

  1. hdu 5441 (2015长春网络赛E题 带权并查集 )

    n个结点,m条边,权值是 从u到v所花的时间 ,每次询问会给一个时间,权值比 询问值小的边就可以走 从u到v 和从v到u算不同的两次 输出有多少种不同的走法(大概是这个意思吧)先把边的权值 从小到大排 ...

  2. hdu 5443 (2015长春网赛G题 求区间最值)

    求区间最值,数据范围也很小,因为只会线段树,所以套了线段树模板=.= Sample Input3110011 151 2 3 4 551 21 32 43 43 531 999999 141 11 2 ...

  3. ACM学习历程—HDU 5443 The Water Problem(RMQ)(2015长春网赛1007题)

    Problem Description In Land waterless, water is a very limited resource. People always fight for the ...

  4. ACM学习历程—HDU 5446 Unknown Treasure(数论)(2015长春网赛1010题)

    Problem Description On the way to the next secret treasure hiding place, the mathematician discovere ...

  5. HDU 5531 Rebuild (2015长春现场赛,计算几何+三分法)

    Rebuild Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total S ...

  6. hihocoder1236(2015长春网赛J题) Scores(bitset && 分块)

    题意:给你50000个五维点(a1,a2,a3,a4,a5),50000个询问(q1,q2,q3,q4,q5),问已知点里有多少个点(x1,x2,x3,x4,x5)满足(xi<=qi,i=1,2 ...

  7. (并查集)Travel -- hdu -- 5441(2015 ACM/ICPC Asia Regional Changchun Online )

    http://acm.hdu.edu.cn/showproblem.php?pid=5441 Travel Time Limit: 1500/1000 MS (Java/Others)    Memo ...

  8. HDU 4764 Stone (2013长春网络赛,水博弈)

    Stone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  9. Travel(HDU 5441 2015长春区域赛 带权并查集)

    Travel Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Su ...

随机推荐

  1. swift 获取Documnets 的路径 和 CGD 延迟

    // CGD 延迟 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64( * NSEC_PER_SEC)), dispatch_get_main ...

  2. python脚本

    python源码编译 python -O -m py_compile file.py [root@localhost python]# cat dbass.py #!/usr/local/bin/py ...

  3. SQL Select语句完整的执行顺序(转)

    SQL Select语句完整的执行顺序: 1.from子句组装来自不同数据源的数据: 2.where子句基于指定的条件对记录行进行筛选: 3.group by子句将数据划分为多个分组: 4.使用聚集函 ...

  4. Linux系统服务之inetd

    [Linux系统服务之inetd] inetd的角色是作为Telnet和FTP等与网络服务器相关的进程的“超级服务器”.这是一个简单的道理:并不是全部的服务器进程(包括那些接受新的Telnet和FTP ...

  5. java正则验证

    String regex ="[A-Z]{4}[0-9]{7}"; List<String> non= new ArrayList<String>(); f ...

  6. dns隧道 dns2tcpd

    有些网络的防火墙设置只允许端口53的UDP流量,就不能通过tcp搭建隧道,这种情况下我们可以通过UDP搭建DNS隧道,通过搭建一个DNS服务器委派的子域,这个子域因为使我们自己搭建的主机,这时候就可以 ...

  7. opencv: Rotate image by 90, 180 or 270 degrees

    opencv2: void rotate_cw(const cv::Mat& image, cv::Mat& dest, int degrees) { ) { : dest = ima ...

  8. HDU 4027 Can you answer these queries? (线段树区间修改查询)

    描述 A lot of battleships of evil are arranged in a line before the battle. Our commander decides to u ...

  9. C++编译中的内存分配

    一个由 C/C++ 编译的程序占用的内存分为以下五个部分 代码区:存放CPU执行的机器指令,代码区是可共享,并且是只读的. 数据区:存放已初始化的全局变量.静态变量(全局和局部).常量数据. BBS区 ...

  10. 【校招面试 之 C/C++】第14题 C++ 内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区(堆栈的区别)

    栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等.在一个进程中,位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调用.和堆一样 ...