计蒜客 拥挤
本题采用最小生成树。
不多说,上代码。
#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;
}