您的位置:首页 > 其它

hdu 3938 Portal离线并查集

2015-01-26 13:59 399 查看
题意搞得迷迷糊糊的

参考:http://blog.csdn.net/sdj222555/article/details/7439187

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<map>
#include<iomanip>
#define INF 99999999
#define MAXN 10005
using namespace std;

int fa[MAXN], num[MAXN];
long long out[MAXN];
int n, m, q;

//适用于正负整数
template <class T>
inline bool scan_d(T &ret) {
char c; int sgn;
if (c = getchar(), c == EOF) return 0; //EOF
while (c != '-' && (c<'0' || c>'9')) c = getchar();
sgn = (c == '-') ? -1 : 1;
ret = (c == '-') ? 0 : (c - '0');
while (c = getchar(), c >= '0'&&c <= '9') ret = ret * 10 + (c - '0');
ret *= sgn;
return 1;
}

struct node {
int u, v, w;
bool operator < (const node& a) const {
return w < a.w;
}
}edge[MAXN*10];

struct wen {
int l, id;
bool operator <(const wen &a) const {
return l < a.l;
}
}p[MAXN];

void init()
{
for (int i = 1; i <= n; ++i) {
fa[i] = i;
num[i] = 1;
}
}

int find(int x)
{
if (fa[x] == x) return x;
int t = find(fa[x]);
fa[x] = t;
return t;
}

int join(int x, int y)
{
int fx = find(x);
int fy = find(y);
if (fx == fy) return 0;
int t = num[fx] * num[fy];
num[fx] += num[fy];
num[fy] = 0;
fa[fy] = fx;
return t;
}

int main()
{
while (cin >> n >> m >> q) {
init();
for (int i = 1; i <= m; ++i){
//cin >> edge[i].u >> edge[i].v >> edge[i].w;
scan_d(edge[i].u);
scan_d(edge[i].v);
scan_d(edge[i].w);
}
sort(edge + 1, edge + m + 1);
for (int i = 1; i <= q; ++i) {
//cin >> p[i].l;
scan_d(p[i].l);
p[i].id = i;
}
sort(p+1,p+q+1);
int pos = 1;
long long ans = 0;
for (int i = 1; i <= q; ++i) {
while (pos <= m && edge[pos].w <= p[i].l) {
ans += join(edge[pos].u,edge[pos].v);
pos++;
}
out[p[i].id] = ans;
}
for (int i = 1; i <= q; ++i) {
cout << out[i] << endl;
}
}
return 0;
}


代码搬运工
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: