하루 1문제 챌린지/Gold5

백준 16562번 친구비(C++) 🚩

그린푸딩 2024. 2. 27. 08:29
728x90
반응형

29% 틀렸습니다 

왜 안되는거야...

#include <iostream>
#include<vector>
#include<map>

using namespace std;

vector<int>parent; 

int find(int node){
    
    if(parent[node]<0){
        return node; 
    }
    
    return parent[node]=find(parent[node]);
}

void unions(int x,int y){
    
    int xp=find(x);
    int yp=find(y);
    
    if(xp==yp)return;
    
    if(parent[xp]<parent[yp]){
        parent[xp]+=parent[yp];
        parent[yp]=xp; 
    
    }
    if(parent[yp]<=parent[xp]){
        parent[yp]+=parent[xp];
        parent[xp]=yp; 
    }
}


int main()
{
   int n,m;
   long long k;
   
   cin>>n>>m>>k; 
   
   vector<int>arr;     
   arr.assign(n+1,0);
   parent.assign(n+1,-1); 
   
   for(int i=1;i<=n;i++){
       cin>>arr[i];
   }
  
   int v,w;
   
   for(int i=0;i<m;i++){
       cin>>v>>w; 
       unions(v,w);
   }
   
   //값이 더작은것을 택하기 

   map<int,int>M;
   long long k1=0;
   
   for(int i=1;i<=n;i++){
       
       if(parent[i]<0){
          M[i]=arr[i];
       }
   }
   
   
   for(int i=1;i<=n;i++){
       if(parent[i]>0){
           M[parent[i]]=min(arr[i],M[parent[i]]);
       }     
   }
   
   
  for(auto it=M.begin();it!=M.end();it++){
      k1+=(it->second);
  }
  
  
  if(k1>k){
     cout<<"Oh no\n";
  }
  else{
  
     cout<<k1<<"\n";
  }
 
    return 0;
}

 

맞았습니다

union부분 if,ese로 안하고 if 따로 해줬다가 계속 틀렸습니다 뜸..

#include <iostream>
#include<vector>
#include<map>

using namespace std;

vector<int>parent; 

int find(int node){
    
    if(parent[node]<0){
        return node; 
    }
    
    return parent[node]=find(parent[node]);
}

void unions(int x,int y){
    
    int xp=find(x);
    int yp=find(y);
    
    if(xp==yp)return;
    
    if(parent[xp]<parent[yp]){
        parent[xp]=yp;
    }
    else if(parent[yp]<=parent[xp]){
        parent[yp]=xp;
    }
}


int main()
{
   int n,m;
   long long k;
   
   cin>>n>>m>>k; 
   
   vector<int>arr;     
   parent.assign(n+1,0); 
   
   for(int i=1;i<=n;i++){
       cin>>parent[i];
       parent[i]*=-1;
   }
  
   int v,w;
   
   for(int i=0;i<m;i++){
       cin>>v>>w; 
       unions(v,w);
   }
   
   //값이 더작은것을 택하기 

   long long k1=0;
   
   for(int i=1;i<=n;i++){
       if(parent[i]<0){
           k1+=parent[i]*-1;
       }
   }

  if(k1>k){
     cout<<"Oh no\n";
  }
  else{
  
     cout<<k1<<"\n";
  }
 
    return 0;
}
728x90
반응형