Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<vector>
- using namespace std;
- int n,m,p;
- typedef long long int ll;
- typedef struct{
- int v;
- ll w;
- }edge;
- vector<edge> adj[40010];
- int component[40010];
- bool visited[40010];
- pair<int,int> restricted[50010];
- void dfs(int u,int c,ll cW){
- if(visited[u])return;
- component[u] = c;
- visited[u] = true;
- for(int i=0;i<adj[u].size();i++){
- int v = adj[u][i].v;
- ll w = adj[u][i].w;
- if(w < cW && !visited[v]){
- dfs(v,c,cW);
- }
- }
- }
- bool check(ll cW){ //return true if can't copying
- for(int i=1;i<=n;i++){
- component[i] = i;
- visited[i] = false;
- }
- for(int i=1;i<=n;i++){
- if(!visited[i]){
- dfs(i,i,cW);
- }
- }
- for(int i=0;i<p;i++){
- if(component[restricted[i].first] == component[restricted[i].second]){
- return false;
- }
- }
- return true;
- }
- int main(){
- scanf("%d %d %d",&n,&m,&p);
- ll maxW = -2e9;
- for(int i=0;i<m;i++){
- int u,v;
- ll w;
- scanf("%d %d %lld",&u,&v,&w);
- if(w > maxW)maxW = w;
- adj[u].push_back({v,w});
- adj[v].push_back({u,w});
- }
- for(int i=0;i<p;i++){
- scanf("%d %d",&restricted[i].first,&restricted[i].second);
- }
- if(check(maxW+1)){
- printf("-1");
- return 0;
- }
- ll l = 0 , r = maxW;
- ll ans = -2e9;
- while(l <= r){
- ll m = (l+r)/2;
- if(check(m)){
- if(m > ans)ans = m;
- l = m + 1;
- }else{
- r = m - 1;
- }
- }
- printf("%lld",ans);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment