Submission
Status:
(PPPPPPPPP)(PPPP)(PPPPPP)(PPPPPPPPPP)
Subtask/Task Score:
{25/25}{25/25}{20/20}{30/30}
Score: 100
User: mydKN
Problemset: เดินทางข้ามชุมชน
Language: cpp
Time: 0.162 second
Submitted On: 2026-03-09 23:10:04
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
struct Edge{
int w, u, v;
bool operator<(const Edge& o) const{
return w < o.w;
}
};
struct Query{
int w, u, v, i;
bool operator<(const Query& o) const{
return w < o.w;
}
};
const int maxn = 1e5 + 5;
const int maxq = 3e5 + 5;
int n, m, q;
vector<Edge> edge;
vector<Query> query;
int pa[maxn], sz[maxn];
bool res[maxq];
int findset(int u){
if(pa[u] == u) return u;
return pa[u] = findset(pa[u]);
}
void unite(int u, int v){
u = findset(u);
v = findset(v);
if(u == v) return;
if(sz[v] > sz[u]) swap(u, v);
sz[u] += sz[v];
pa[v] = u;
}
int main(){
ios_base::sync_with_stdio(0);cin.tie(0);
cin >> n >> m >> q;
for(int i=0;i<m;++i){
int u, v, w;
cin >> u >> v >> w;
edge.pb({w, u, v});
}
for(int i=0;i<q;++i){
int u, v, w;
cin >> u >> v >> w;
query.pb({w, u, v, i});
}
sort(query.begin(), query.end());
sort(edge.begin(), edge.end());
iota(pa, pa+n, 0);
fill(sz, sz+n, 1);
int idx = 0;
for(auto [w, u, v, i] : query){
while(idx < m && edge[idx].w <= w){
unite(edge[idx].u, edge[idx].v);
++idx;
}
res[i] = (findset(u) == findset(v));
}
for(int i=0;i<q;++i){
cout << (res[i] ? "Yes" : "No") << "\n";
}
}