Problem - 3938

  题意是要求出给定权值下,满足要求的点对的数目。所谓的要求是,给出两点,之间会有很多路径,这个点对的最小距离是众多路径中,最短的一条路径的长度,路径长度是路径上最长边的长度。于是,认真观察可以发现,两个点能连在一起的前提条件是,之间的的边都小于给定值。于是,用边来构建最小生成树就可以得到这样的一些满足要求的点对了。如果是两个集合因为一条边的加入连在一起了,那么总的点对数目就增加Na*Nb。把答案存下来,然后查询的时候二分找出满足的那一个即可。

代码如下:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <set> using namespace std; const int N = ;
const int M = ;
struct Edge {
int s, t, c;
Edge() {}
Edge(int s, int t, int c) : s(s), t(t), c(c) {}
bool operator < (Edge x) const { return c < x.c;}
} edge[M]; struct MFS {
int fa[N], cnt[N];
void init() { for (int i = ; i < N; i++) fa[i] = i, cnt[i] = ;}
int find(int x) { return fa[x] = fa[x] == x ? x : find(fa[x]);}
int merge(int x, int y) {
int fx = find(x), fy = find(y);
if (fx == fy) return ;
int tmp = cnt[fx] * cnt[fy];
fa[fx] = fy;
cnt[fy] += cnt[fx];
return tmp;
}
} mfs; typedef pair<int, int> PII;
const int UPBOUND = ;
set<PII> mark; void MST(int n, int m) {
sort(edge, edge + m);
mfs.init();
mark.clear();
mark.insert(PII(, ));
int sum = ;
for (int i = ; i < m; i++) {
if (sum > UPBOUND) break;
sum += mfs.merge(edge[i].s, edge[i].t);
mark.insert(PII(edge[i].c, sum));
//cout << edge[i].c << ' ' << sum << endl;
}
} int main() {
int n, m, q, x;
set<PII>::iterator si;
while (~scanf("%d%d%d", &n, &m, &q)) {
for (int i = ; i < m; i++) {
Edge &e = edge[i];
scanf("%d%d%d", &e.s, &e.t, &e.c);
}
MST(n, m);
for (int i = ; i < q; i++) {
scanf("%d", &x);
si = mark.upper_bound(PII(x, UPBOUND));
si--;
printf("%d\n", (*si).second);
}
}
return ;
}

——written by Lyon

hdu 3938 Portal (prim+离线)的更多相关文章

  1. HDU 3938 Portal (离线并查集,此题思路很强!!!,得到所谓的距离很巧妙)

    Portal Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Subm ...

  2. hdu 3938 Portal(并查集+离线+kruskal)2011 Multi-University Training Contest 10

    搜了题解才把题搞明白.明白之后发现其实题意很清晰,解题思路也很清晰,只是题目表述的很不清晰…… 大意如下—— 给你一个无向图,图中任意两点的距离是两点间所有路径上的某一条边,这条边需要满足两个条件:1 ...

  3. hdu 3948 Portal (kusral+离线)

    Portal Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Subm ...

  4. hdu 3938 Portal

    Portal Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Sub ...

  5. HDU 3938:Portal(并查集+离线处理)

    http://acm.hdu.edu.cn/showproblem.php?pid=3938 Portal Problem Description   ZLGG found a magic theor ...

  6. 数值标记问题 离线+树状数组 HDU 3938 + HDU 3333

    HDU 3938 题目大意:给你一个长度为n的数组a,定义区间[l,r]的val为区间内所有不同的数值之和.现在有m个询问,每次询问一个区间,问区间的val是多少. 思路:将所有的询问按照右端点排序. ...

  7. 【HDU 3938】Portal (并查集+离线)

    http://acm.hdu.edu.cn/showproblem.php?pid=3938 两点之间建立传送门需要的能量为他们之间所有路径里最小的T,一条路径的T为该路径上最长的边的长度.现在 Q ...

  8. hdu Portal(离线,并查集)

    题意:在一张无向图上,已知边权,做q组询问,问小于L的点对共有几组.点对间的距离取=min(两点之间每一条通路上的最大值). 分析:这里取最大值的最小值,常用到二分.而这里利用离线算法,先对边从小到大 ...

  9. 集合问题 离线+并查集 HDU 3938

    题目大意:给你n个点,m条边,q个询问,每条边有一个val,每次询问也询问一个val,定义:这样条件的两个点(u,v),使得u->v的的价值就是所有的通路中的的最长的边最短.问满足这样的点对有几 ...

随机推荐

  1. spring boot 的 ApplicationContext 及 getbean

    在spring中,我们通过如下代码取得一个spring托管类: ApplicationContext ac = new FileSystemXmlApplicationContext("ap ...

  2. Java图片高保真缩放工具类

    Java图片高保真缩放 package com.xindai.auth.service.util; import java.awt.image.BufferedImage; import java.i ...

  3. python中操作json

    1.导入json包 import json 2.打开json文档 fp = open(jsonpath) 3.读取json文件 data=json.load(fp) 4.获取json的值 data[' ...

  4. 关于Ajax提交后无法刷新iframe页面的问题

    原因及解决方法: 要把刷新代码写进ajax的代码块里面,而不是放在后面

  5. config.js配置页面中的样式和图片路径

    这个文章用在什么地方,我先说一下,上周啊,我接到一个任务.因为公司业务要对接不同的银行,例如在工行下颜色是红色的,在其他银行下默认为蓝色,所以在页面一致的情况下,保证页面中的按钮和ICON是可以配置的 ...

  6. 微信小程序--Tab栏切换的快速实现

    上效果! wxss样式代码: .tabs-item.selected { color:rgba(,,,.); border-bottom:2px solid rgba(,,,.); } .tabs-i ...

  7. Liferay 7 OSGi第三方jar包依赖问题

    发现遇到这个问题的人挺多的,现在跟新一下好好写. 在开发Liferay的时候,我们常常会遇到Unresolved requirement: Import-Package: {package name} ...

  8. JavaScript--结合CSS变形、缩放能拖拽的登录框

    上例图: 代码块: <!DOCTYPE html> <html> <head lang="en"> <meta charset=" ...

  9. LeetCode136 Single Number, LeetCode137 Single Number II, LeetCode260 Single Number III

    136. Single Number Given an array of integers, every element appears twice except for one. Find that ...

  10. nginx+tomcat集群+redis(memcache)session共享!

    常用保持session的方式: 1.一些代理(比如nginxIP_hash) 1.使用数据库来存储Session 2.使用Cookie来存储Session                       ...