Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long lli;
- typedef pair<int, int> pii;
- typedef tuple<int, int, int> tiii;
- const int N = 4e4;
- const int P = 5e4;
- vector<tiii> edges;
- int ds[N + 1], sz[N + 1], nVertex, nCopy;
- pii copying[P + 1];
- int dsFind(int u){
- if(ds[u] == u){
- return u;
- }
- return ds[u] = dsFind(ds[u]);
- }
- bool isDisconnect(int upbWeight){
- for(int i = 1; i <= nVertex; ++i){
- ds[i] = i;
- sz[i] = 1;
- }
- for(tiii e : edges){
- int w = get<0>(e);
- int u = get<1>(e);
- int v = get<2>(e);
- if(w >= upbWeight){
- break;
- }
- u = dsFind(u);
- v = dsFind(v);
- if(u != v){
- if(sz[u] < sz[v]){
- swap(u, v);
- }
- ds[v] = u;
- sz[u] += sz[v];
- }
- }
- for(int i = 1; i <= nCopy; ++i){
- if(dsFind(copying[i].first) == dsFind(copying[i].second)){
- return false;
- }
- }
- return true;
- }
- int main(){
- int nEdge;
- scanf("%d%d%d", &nVertex, &nEdge, &nCopy);
- int mxFriendship = 1;
- for(int i = 1; i <= nEdge; ++i){
- int u, v, w;
- scanf("%d%d%d", &u, &v, &w);
- edges.emplace_back(w, u, v);
- mxFriendship = max(mxFriendship, w);
- }
- sort(edges.begin(), edges.end());
- for(int i = 1; i <= nCopy; ++i){
- int u, v;
- scanf("%d%d", &u, &v);
- copying[i] = pii(u, v);
- }
- int l = 1;
- int r = mxFriendship + 1;
- int ans = 1;
- while(l <= r){
- int m = ((lli)l + r) / 2;
- if(isDisconnect(m)){
- ans = max(ans, m);
- l = m + 1;
- } else {
- r = m - 1;
- }
- }
- if(ans == mxFriendship + 1){
- cout << "-1";
- } else {
- cout << ans;
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment