拥挤 - 最小生成树

计蒜客 拥挤
本题采用最小生成树。
不多说,上代码。

#include<cstdio>
#include<cstring>
#include<set>
#include<vector>
#include<algorithm>
using namespace std;

const int N =  50000+5;
const int M = 200000+5;
const int Q = 100000+5;
struct edge{
  int u,v,w;
  friend bool operator<(edge x,edge y){ return x.w < y.w; }
} edges[M];
int n,m,q;
int parent[N];
int ans[Q];
set<int> query[N];
void init(int x) { for (int i=0; i<=x; i++) parent[i]=i; }
int find(int x) { return x == parent[x] ? x : parent[x] = find(parent[x]); }

int main(){
  scanf("%d%d%d",&n,&m,&q);
  for(int i=0;i<m;++i) scanf("%d%d%d",&edges[i].u,&edges[i].v,&edges[i].w);
  for(int i=0;i<q;++i){ int x,y; scanf("%d%d",&x,&y); query[x].insert(i); query[y].insert(i); }

  init(N);
  memset(ans,0xff,sizeof ans);
  sort(edges,edges+m);

  for(int i=0;i<m;++i){
    int x=edges[i].u, y=edges[i].v, c=edges[i].w;
    int px=find(x), py=find(y);
    if(px==py) continue;

    if(query[px].size() > query[py].size()) swap(px,py);
    vector<int> vi;
    for(set<int>::iterator itr=query[px].begin();itr!=query[px].end();++itr){
      int id=*itr;
      if(query[py].count(id)){ ans[id]=c; vi.push_back(id); }
      query[py].insert(id);
    }
    for(int j=0;j<(int)vi.size();++j) query[py].erase(vi[j]);

    parent[px]=py;
  }
  for(int i=0;i<q;++i) printf("%d\n",ans[i]);
  return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值