C++
1#include <iostream>2#include <vector>3#include <algorithm>4#include <map>5#include <set>6using namespace std;7using ll = long long;8using llu = unsigned long long;9using dd = double;10 11class DisjointSet{12 public:13 vector<int> rank, p, treesize;14 DisjointSet() {}15 DisjointSet(int size){16 rank.resize(size, 0);17 p.resize(size, 0);18 treesize.resize(size, 1);//根のみサイズとしては信用できます19 for(int i=0; i<size; i++) makeSet(i);20 }21 22 void makeSet(int x){23 p[x]=x;24 rank[x]=0;25 treesize[x]=1;26 }27 28 bool same(int x, int y){29 return findSet(x)==findSet(y);30 }31 32 void unite(int x,int y){33 link(findSet(x), findSet(y));34 }35 36 void link(int x, int y){37 if(x==y)return;38 39 if(rank[x]>rank[y]){40 p[y]=x;41 }else{42 p[x]=y;43 if(rank[x]==rank[y]){44 rank[y]++;45 }46 }47 int s=treesize[x]+treesize[y];48 treesize[x]=s;49 treesize[y]=s;50 }51 52 int findSet(int x){53 if(x!=p[x]){54 p[x]=findSet(p[x]);55 }56 return p[x];57 }58};59 60 61 62struct Edge {63 int x, y, w;64 Edge() {}65 Edge(int x, int y, int w) : x(x), y(y), w(w) {}66 friend bool operator < (const Edge &a, const Edge &b) { return a.w < b.w || ((a.w == b.w) && a.x < b.x) || (((a.w == b.w) && a.x == b.x) && a.y < b.y); }67};68map<Edge, ll> TT;69int main() {70 ll N, M, Q;71 cin >> N >> M >>Q;72 vector<Edge> edges(0);73 74 for (ll i = 0; i < M; ++i) {75 ll u, v, w; 76 cin >> u >> v >> w;77 u--;v--;78 edges.push_back(Edge(u, v,w));79 }80 for (ll i = 0; i < Q; ++i) {81 ll u, v, w;82 cin >> u >> v >> w;83 u--;v--;84 edges.push_back(Edge(u, v,w));85 TT[edges[i+M]]=i+1;86 }87 sort(edges.begin(), edges.end());88 89 90 // クラスカル法91 DisjointSet uf(N);92 vector<bool> ans(Q+1,false);93 for (ll i = 0; i < edges.size(); ++i) {94 ll u = edges[i].x;95 ll v = edges[i].y;96 if(TT.find(edges[i])!=TT.end()){97 if(uf.same(u, v)){98 ans[TT[edges[i]]]=false;99 100 }101 else{102 ans[TT[edges[i]]]=true;103 }104 // cout<<TT[edges[i]]<<edges[i].x<<edges[i].y<<edges[i].w<<endl;105 continue;106 }107 else{108 if (uf.same(u, v)) continue;109 uf.unite(u, v);110 }111 }112 113 114 for(ll i=1;i<=Q;i++){115 if(ans[i])116 cout<<"Yes"<<endl;117 else{118 cout<<"No"<<endl;119 }120 } 121}

0 コメント