HDU3938 Portal
来源:互联网 发布:workflow软件 编辑:程序博客网 时间:2024/06/07 03:15
Portal
题目链接:Click Here~
题目分析:
ZLGG found a magic theory that the bigger banana the bigger banana peel .This important theory can help him make a portal in our universal. Unfortunately, making a pair of portals will cost min{T} energies. T in a path between point V and point U is the length of the longest edge in the path. There may be lots of paths between two points. Now ZLGG owned L energies and he want to know how many kind of path he could make.
There are multiple test cases. The first line of input contains three integer N, M and Q (1 < N ≤ 10,000, 0 < M ≤ 50,000, 0 < Q ≤ 10,000). N is the number of points, M is the number of edges and Q is the number of queries. Each of the next M lines contains three integers a, b, and c (1 ≤ a, b ≤ N, 0 ≤ c ≤ 10^8) describing an edge connecting the point a and b with cost c. Each of the following Q lines contain a single integer L (0 ≤ L ≤ 10^8).
题目有点难看懂,一开始看不懂什么意思。后来才知道,告诉你两个顶点u和v.然后,这两个点之间的花费是这两个点中最长距离路的大小。然后,每次会给你一个能力值,叫你求出在能量范围内的路径方法数。
算法分析:
并查集+离线。
这道题,不是我自己想出来的。是看了别人的解体报告才知道做法的。虽然以前有用过离线的做法,但是我没有想到联系到这道题上。为什么可以用到离线呢?因为我们知道小能量的范围一定可以满足大能量的要求。所以,我们可以从小到大的求出,在离线输出。
#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>using namespace std;const int maxn = 1e4 + 5;int f[maxn],rank[maxn],ans[maxn];void Init(){ for(int i = 0;i < maxn;++i) f[i] = i,rank[i] = 1;}struct Node{ int from,to,val; bool operator<(const Node& a)const{ return val < a.val; }}node[5*maxn];struct Point{ int id,L; bool operator<(const Point& a)const{ return L < a.L; }}p[maxn];int Find(int x){ if(x == f[x]) return f[x]; return f[x] = Find(f[x]);}int Union(int u,int v){ int a = Find(u),b = Find(v); if(a == b)return 0; int tmp = rank[a]*rank[b]; rank[a] += rank[b]; f[b] = a; return tmp;}int main(){ int n,m,q; while(~scanf("%d%d%d",&n,&m,&q)) { for(int i = 0;i < m;++i) scanf("%d%d%d",&node[i].from,&node[i].to,&node[i].val); for(int i = 0;i < q;++i){ scanf("%d",&p[i].L); p[i].id = i; } sort(node,node+m); sort(p,p+q); Init(); int j = 0,cnt = 0; for(int i = 0;i < q;++i){ while(j<m&&node[j].val<=p[i].L){ cnt += Union(node[j].from,node[j].to); j++; } ans[p[i].id] = cnt; } for(int i = 0;i < q;++i) printf("%d\n",ans[i]); } return 0;}
2 0
- HDU3938 Portal
- hdu3938 Portal
- HDU3938 Portal
- hdu3938(Portal)并查集
- HDU3938 Portal 并查集
- portal
- Portal
- Portal
- portal
- Portal
- portal
- Portal
- Portal
- Portal
- portal
- portal
- HDU3938 并查集 并查集
- hdu3938(并查集+离线)
- hdu 1002
- java中可定制的序列化过程 writeObject与readObject
- 字符和数字的转换函数
- 非线性规划 模型与基本概念
- 第四周 项目3 程序的多文件组织
- HDU3938 Portal
- PlayFramework+Maven+Eclipse
- CodeForces 222D Olympiad
- Jquery html 突出显示某张图片或文字效果 亮暗效果
- 让你的table变成exls吧
- 如何利用Python和VC6.0对SQLite数据库进行操作
- 题目1476:平方因子
- 设计模式之工厂模式
- Unity Shader笔记20140322——half4, _Time