HDOJ 4750 - Count The Pairs 并查集

原创 2013年09月21日 20:51:08

               题意:

                        定义f(u,v)为u到v每条路径上的最大边的最小值..现在有一些询问..问f(u,v)>=t的点对有所少对..注意(1,2)和(2,1)是不同的点对...

               题解:

                        正过来想不太好做..反过来..看在当前t的限制下..有多少个点对f(u,v)<t...这样答案就是totol-num...totol是总对数n*(n-1)...num是当前可联通的..

                        这样转化后就不难想到将所有的询问从小到大排序..将所有的边从小到大排序..然后根据递增的询问不断地加边统计答案..而要统计答案和维护图的联通关系时用到并查集....如此时间复杂度为O(m)..


Program:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdlib>
#include<stack>
#include<map>
#define MAXN 10005
#define MAXM 1000505
#define ll long long 
#define eps 1e-10
using namespace std; 
struct node
{
    int x,y,d,next;
}edge[MAXM];
struct NODE1
{
    int x,y,d;
}E[MAXM];
struct NODE2
{
    ll w,id;
}q[MAXM]; 
int father[MAXN];
ll ans[MAXM],num[MAXN];
bool cmp1(NODE1 a,NODE1 b)
{
    return a.d<b.d;
}
bool cmp2(NODE2 a,NODE2 b)
{
    return a.w<b.w;
}
int getfather(int x)
{
    if (father[x]==x) return x;
    return father[x]=getfather(father[x]);
}
int main()
{
    int n,m,x,y,d,p,i,t;
    ll totol,A; 
    while(~scanf("%d%d",&n,&m))
    { 
           for (i=1;i<=m;i++) scanf("%d%d%d",&E[i].x,&E[i].y,&E[i].d); 
           scanf("%d",&p),totol=n*(n-1);
           for (i=1;i<=p;i++) scanf("%I64d",&q[i].w),q[i].id=i;
           sort(E+1,E+1+m,cmp1),sort(q+1,q+1+p,cmp2);
           for (i=0;i<n;i++) father[i]=i,num[i]=1;
           A=0,t=1;
           for (i=1;i<=p;i++) 
           {
                   d=q[i].w;
                   while (t<=m && E[t].d<d)
                   {
                           x=getfather(E[t].x),y=getfather(E[t].y);
                           if (x==y) { t++; continue; }
                           A+=num[x]*num[y]*2;
                           num[y]+=num[x];
                           father[x]=y;                
                           t++;        
                   }
                   ans[q[i].id]=totol-A;
           }
           for (i=1;i<=p;i++) printf("%I64d\n",ans[i]);
    }
    return 0;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kk303/article/details/11880561

HDOJ 4750 Count The Pairs

按边长从小到大排序。。。再逐个加入(就像MST一样)最先联通的点之间最长路径中的最小值就是新加入的边的长。。。。Count The PairsTime Limit: 20000/10000 MS (J...
  • u012797220
  • u012797220
  • 2014-11-04 11:22:10
  • 328

HDU 4750 Count The Pairs

离线并查集,求解思路和HDU 3938是相同的。。。 #include #include #include #include #include #include #include...
  • u011728372
  • u011728372
  • 2013-11-23 19:05:47
  • 514

hdu 4750——Count The Pairs

题意:南京理工大学有很多景点。两个景点组成一对。两个景点的价值用这种方式计算:设两个景点之间一条路径中最长的一条路的距离是s,这两个景点的价值f就是所有路径中s的最小值。游客想要找价值大于等于t的景点...
  • u010734277
  • u010734277
  • 2015-08-06 19:16:40
  • 316

hdu 4750 Count The Pairs

题意:一个无向图,定义m
  • squee_spoon
  • squee_spoon
  • 2014-08-29 10:09:01
  • 283

Count The Pairs HDU - 4750

点击打开链接 最小生成树的题目 这道题开始没有思路 看了别人用什么方法才会的 (点击打开链接) 主要是两个问题 1. 在kruskal算法中 通过并查集记录当前已找到的边所确立的各个独立子图 而这里每...
  • sunyutian1998
  • sunyutian1998
  • 2017-08-03 14:29:50
  • 79

hdu 4750 Count The Pairs 并查集+离线

我们对于边来按权值的大小升序排序,然后我们来考虑现有的一边E (u,v,cost),如果u,v. 1,如果u,v 属于一个集合,那么这个边没有任何用处,因为集合内部的边可通过小于cost边联通,对于集...
  • u010790071
  • u010790071
  • 2013-09-21 18:12:51
  • 1256

HDU - 4750 Count The Pairs (最小生成树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4750点击打开链接 Count The Pairs Time Limit: 20000/10...
  • xuejye
  • xuejye
  • 2017-08-13 00:32:05
  • 123

HDU 4750 Count The Pairs(最小生成树)

HDU 4750 Count The Pairs(最小生成树) http://acm.hdu.edu.cn/showproblem.php?pid=4750 题意:        有一个N个顶点M条边...
  • u013480600
  • u013480600
  • 2014-07-22 12:07:29
  • 955

HDU 4750 Count The Pairs (最小生成树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4750 题意:
  • u013742332
  • u013742332
  • 2014-09-19 14:36:24
  • 273
收藏助手
不良信息举报
您举报文章:HDOJ 4750 - Count The Pairs 并查集
举报原因:
原因补充:

(最多只允许输入30个字)