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.
#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;
}
原文:http://blog.csdn.net/zhongshijunacm/article/details/21827729