hdu4750Count The Pairs(最小生成树找瓶颈边)

/*
   题意:就是给你一个图,图的每两个点都有多条路径,每一条路径中都有一条最大边,
   所有最大边的最小边(也就是瓶颈边)就是这两点之间的val值!然后给你一个值f,
   问有多少个顶点对的val>=f! (u,v) 和 (v, u)是不同的顶点对!

   思路:最小生成树(kruskral)那么每两个节点(u,v)的瓶颈边就是这一棵树中u到v
         的路径中的最大边值!
         在利用并查集的过程中,A, B两个集合,如果有u属于A,v属于B,且u-v可以将
         A-B集合连接起来,因为边值由小到大选取,那么以u-v边为瓶颈边的节点的个数
         就是[A]*[B]*2;

   注意:图不一定是连通的,开始的时候当成了一棵树,怎么改都不对!
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define N 10105
#define M 500105
using namespace std;
int f[N];
struct Edge{
    int u, v, w;
    Edge(){}
    Edge(int u, int v, int w){
        this->u=u;
        this->v=v;
        this->w=w;
    }
};

Edge edge[M];
int dist[N];
int rank[N];
int cnt[N];
int edgeN;
int sumN[N];
int n, m;

bool cmp(Edge a, Edge b){
   return a.w < b.w;
}

int getFather(int x){
   return x==f[x] ? x : f[x]=getFather(f[x]);
}

bool Union(int a, int b){
   a=getFather(a);
   b=getFather(b);
   if(a!=b){
      cnt[++edgeN]=sumN[a]*sumN[b]*2;//记录以这一条边为瓶颈边的节点对的个数
      if(rank[a]>rank[b]){
          f[b]=a;
          sumN[a]+=sumN[b];//将b集合放入到a集合中去
      }
      else{
         f[a]=b;
         sumN[b]+=sumN[a];//将a集合放入到b集合中去
         ++rank[b];
      }
      return true;
   }
   return false;
}

void Kruskral(){
   edgeN=0;
   sort(edge, edge+m, cmp);
   for(int i=1; i<=n; ++i)
      f[i]=i, rank[i]=0, sumN[i]=1;
   for(int i=0; i<m; ++i)
    if(Union(edge[i].u, edge[i].v))
       dist[edgeN]=edge[i].w;//记录最小生成树中的边值
   cnt[edgeN+1]=0;
   for(int i=edgeN; i>=1; --i)//统计大于等于第i条边为瓶颈边边值的所有节点对的对数
       cnt[i]+=cnt[i+1];
}

int main(){
    int p;
    while(scanf("%d%d", &n, &m)!=EOF){
        for(int i=0; i<m; ++i){
           int u, v, w;
           scanf("%d%d%d", &u, &v, &w);
           edge[i]=Edge(u+1, v+1, w);
        }
        Kruskral();
        scanf("%d", &p);
        while(p--){
           int x;
           scanf("%d", &x);
           int index=lower_bound(dist+1, dist+edgeN+1, x)-dist;
           if(index>edgeN) printf("0\n");
           else printf("%d\n", cnt[index]);
        }
    }
    return 0;
}

//如果最后只有一棵树的话,这样做就可以了!没想到可能不是仅仅一棵树
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define N 10105
#define M 500105
using namespace std;
int f[N];
struct Edge{
    int u, v, w;
    Edge(){}
    Edge(int u, int v, int w){
        this->u=u;
        this->v=v;
        this->w=w;
    }
};

Edge edge[M];
int dist[N];
int rank[N];
int cnt[N];
int edgeN;

int n, m;

bool cmp(Edge a, Edge b){
   return a.w < b.w;
}

int getFather(int x){
   return x==f[x] ? x : f[x]=getFather(f[x]);
}

bool Union(int a, int b){
   a=getFather(a);
   b=getFather(b);
   if(a!=b){
      if(rank[a]>rank[b])
          f[b]=a;
      else{
         f[a]=b;
         ++rank[b];
      }
      return true;
   }
   return false;
}

void Kruskral(){
   edgeN=0;
   sort(edge, edge+m, cmp);
   for(int i=1; i<=n; ++i)
      f[i]=i, rank[i]=0;
   for(int i=0; i<m; ++i)
     if(Union(edge[i].u, edge[i].v))
        dist[++edgeN]=edge[i].w;
   cnt[edgeN+1]=0;
   for(int i=edgeN; i>=1; --i){
       cnt[i]=i*2;
       cnt[i]+=cnt[i+1];
   }
}

int main(){
    int p;
    while(scanf("%d%d", &n, &m)!=EOF){
        for(int i=0; i<m; ++i){
           int u, v, w;
           scanf("%d%d%d", &u, &v, &w);
           edge[i]=Edge(u+1, v+1, w);
        }
        Kruskral();
        scanf("%d", &p);
        while(p--){
           int x;
           scanf("%d", &x);
           int index=lower_bound(dist+1, dist+edgeN+1, x)-dist;
           if(index>edgeN) printf("0\n");
           else printf("%d\n", cnt[index]);
        }
    }
    return 0;
}
时间: 2025-01-26 12:05:10

hdu4750Count The Pairs(最小生成树找瓶颈边)的相关文章

hdu 4750 Count The Pairs 最小生成树

      比赛时候水了,一直打算算出22直接的关系数,然后又要考虑图不连通情况等等,搞了半天还没搞定.       其实只要一层一层慢慢加就可以了,最后结果离线或者在线处理一下均可以.       因为最长路的最小值就相当于最小值一个一个添加 贴一下第一个AC队的代码,思路很清晰: #include <cstdio> #include<iostream> #include <algorithm> using namespace std; typedef long lo

网站速度与性能优化要抓主要矛盾解决—瓶颈法

      本文主要是思维性的总结,是总结优化的方法学,对方面上面的错误进行总结.不会涉及到前端具体的技术,比如对js和css进行压缩.合并,减少http请求,缓存头控制等等.这些那本<高性能建站指南>都有现成的.       基于本人在多家公司分别遇到的网站速度与性能问题,多年所积累出的干货;有的开发10年经验,在遇到网站速度问题时,也仍然在犯同样的错误.     一.背景与思维方式   常见的情况:   使用的是1m带宽(因为带宽是比较昂贵的资源,刚开始购买会比较少,起初够用了).基于这个

中大型网站架构演变之路

前言 网上有很多文章类似于我今天要分享的课程,有架构师写的,有运维写的,还有开发些的,偏重点都不同,今天我以咱们运维角度全面讲解. 一个成熟的网站架构并不是一开始设计就具备高可用.高伸缩.高性能等特性的,它是随着用户量和业务线不断增加,基础架构才逐渐健壮的.在发展初期,一般都是从0到1,不会一上来就整一些大而全的架构,也很少人这么任性. 说明 适用业务:电商/门户/招聘网站 开发语言:PHP和JAVA Web服务:Nginx/Tomcat8 数据库:MySQL 操作系统:CentOS 物理服务器

一道面试题:140个google面试题

FROM:酷壳 来源:http://blog.seattleinterviewcoach.com/2009/02/140-google-interview-questions.html(墙) 某猎头收集了140多个Google的面试题,都张到他的Blog中了,主要是下面这些职位的,因为被墙,且无任何敏感信息,所以,我原文搬过来了. Product Marketing Manager Product Manager Software Engineer Software Engineer in Te

减少存储过程封装业务逻辑-web开发与传统软件开发的思维模式不同

  本篇文章讨论并不是:不要使用存储过程,因为有些事情还是要存储过程来完成,不可能不用.而是关于:"业务逻辑是不是要封装在存储过程中实现,这样子php.java等就是调用存储过程".   业务逻辑,通俗说就是:比如要取数据的操作,取出会员编号为x的数据,原来我们一般是封装成函数,或者直接编写sql语句查询.现在是交给数据库的存储过程去完成. +------------------------------------------------------------            

关于图片或者文件在数据库的存储方式归纳

商品图片,用户上传的头像,其他方面的图片.目前业界存储图片有两种做法: 1.  把图片直接以二进制形式存储在数据库中 一般数据库提供一个二进制字段来存储二进制数据.比如mysql中有个blob字段.oracle数据库中是blob或bfile类型   2.  图片存储在磁盘上,数据库字段中保存的是图片的路径.   一.图片以二进制形式直接存储在数据库中   第一种存储实现(php语言): 大体思路: 1.将读取到的图片用php程序转化成二进制形式.再结合insert into 语句插入数据表中的b

网站速度问题排查与定位经验

网站速度定位 总体思想: 1.找瓶颈法.瓶子的颈部(口子)大小决定了出入量,从而决定了速度.不去改善瓶颈,使劲费力气把瓶子容量扩大, 速度也不会提高.不是什么都去改善就是好的.比如改善带宽,加缓存之类的.但是这些不是目前系统的瓶颈,改善 了也不会发生质的飞跃.所以找到瓶颈所在. 与哲学思想中的:找主要矛盾,解决主要矛盾,问题才会解决的思想类似.放到技术中叫做系统瓶颈.突破系统瓶颈.   找到当前的主要矛盾是重要的.去研究代码,获取几毫秒的性能,不如去看看数据库,干掉一条执行超过1000毫秒的语句

使用 Visual Studio 分析器找出应用程序瓶颈

在过去十年间,涌现了许多新的软件技术和平台.每种新技术都要求掌握专门的知识才能创建出性能良好的应用程序.现在,由于各种 Internet 技术(如博客)使失望的用户可轻松地否定您的应用程序,因此您确实需要将性能放到首要位置.在计划早期,就应添加响应性能要求并创建原型来确定可能的技术限制.在整个开发过程中,还应衡量应用程序的各个性能方面以发现可能的性能下降,同时确保速度较慢情形下的测试人员文件并跟踪其错误. 即使拥有最好的计划,仍必须在产品开发过程中调查性能问题.在本文中,我们将向您展示如何使用

linux中sar利用命令找出系统瓶颈方法

内容目录 追溯过去的统计数据 查看CPU使用率 查看平均负载 查看内存使用状况 查看页面交换发生状况 安装 sar参数说明 sar 找出系统瓶颈的利器 sar是System Activity Reporter(系统活动情况报告)的缩写.sar工具将对系统当前的状态进行取样,然后通过计算数据和比例来表达系统的当前运行状态.它的 特点是可以连续对系统取样,获得大量的取样数据:取样数据和分析的结果都可以存入文件,所需的负载很小.sar是目前Linux上最为全面的系统性能分析 工具之一,可以从14个大方