您的位置:首页 > 产品设计 > UI/UE

2017湖南大学ACM程序设计新生杯大赛 - B - Build (并查集&&贪心)

2018-01-21 22:36 281 查看
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
using namespace std;
const int N = 1e6 + 10;
int n,m,q,k;
int fa
,ans
;
struct node{
int u,v,cost;
}e
;
bool cmp(node a,node b){
return a.cost<b.cost;
}
int find(int x){
int be = x;
while(fa[x]!=x) x = fa[x];
while(fa[be]!=be){
int t = fa[be];
fa[be] = x;
be = t;
}
return x;
}
int cnt
,now = 1;
void slove(){
sort(e,e+m,cmp);
for(int i=0;i<=n;i++) {fa[i] = i; cnt[i] = 1;}
for(int i=0;i<m;i++){
if(e[i].cost>=N) break;
while(e[i].cost>now){
ans[now+1] = ans[now];
now++;
}
int faa = find(e[i].u);
int fbb = find(e[i].v);
if(faa == fbb) continue;
fa[fbb] = faa;
ans[now] += cnt[faa]*cnt[fbb];
cnt[faa] += cnt[fbb];
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++){
scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].cost);
}
slove();
scanf("%d",&q);
while(q--){
scanf("%d",&k);
if(k>=1e6) k = 1e6;
while(k>now){
ans[now+1] = ans[now];
now++;
}
printf("%d\n",ans[k]);
}
return 0;
}


#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
using namespace std;
const int N = 1e6 + 10;
int n,m,q,k,ans
;
int fa
,cnt
;
struct node{
int u,v,cost;
}e
;
struct node2{
int id,k;
}sc
;
bool cmp2(node2 a,node2 b){
return a.k<b.k;
}
bool cmp(node a,node b){
return a.cost<b.cost;
}
int find(int x){
int b = x;
while(fa[x]!=x) x = fa[x];
while(fa[b]!=b){
int c = fa[b];
fa[b] = x;
b = c;
}
return x;
}
void slove(){
sort(e,e+m,cmp);
int now = 0;
for(int i=1;i<=n;i++) {fa[i] = i;cnt[i] = 1;}
for(int i=0;i<q;i++){
if(i) ans[sc[i].id] = ans[sc[i-1].id];
while(now<m&&sc[i].k>=e[now].cost){
int faa = find(e[now].u);
int fbb = find(e[now].v);
now++;
if(faa == fbb) continue;
ans[sc[i].id] += cnt[faa] * cnt[fbb];
cnt[faa] += cnt[fbb];
fa[fbb] = faa;
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++){
scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].cost);
}
scanf("%d",&q);
for(int i=0;i<q;i++){
scanf("%d",&sc[i].k);
sc[i].id = i;
}
sort(sc,sc+q,cmp2);
slove();
for(int i=0;i<q;i++){
printf("%d\n",ans[i]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐