SuitNdtie

National Ant Colony

May 2nd, 2019
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.03 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<vector>
  3. #include<algorithm>
  4. #include<stack>
  5. using namespace std;
  6. struct edge{
  7.     int v,w;
  8. };
  9.  
  10. int main()
  11. {
  12.     int n,m,k;
  13.     scanf("%d %d %d",&n,&m,&k);
  14.     int Alledge[m];
  15.     vector<edge> adj[n+1]; //adj list graph
  16.     vector<int> ant[k+1]; //store pos of any ant type
  17.     for(int i = 1 ; i <= n ; i ++) //input ant type by pos
  18.     {
  19.         int x;
  20.         scanf("%d",&x);
  21.         ant[x].push_back(i);
  22.     }
  23.    
  24.     int maxw = 1; //max weight
  25.     for(int i = 0 ; i < m ; i ++){//input edge
  26.         int u,v,w;
  27.         scanf("%d %d %d",&u,&v,&w);
  28.         adj[u].push_back({v,w});
  29.         adj[v].push_back({u,w});
  30.         if(w > maxw)maxw = w;
  31.         Alledge[i] = w;
  32.     }
  33.     sort(Alledge,Alledge+m);
  34.     int p = 0;
  35.     int l = 0 , r = maxw;
  36.     while(l <= r){ //bsearch find best p
  37.         int mid = (l+r)/2;
  38.        
  39.         // dfs write component variable
  40.         int component[n+1];
  41.         bool visited[n+1];
  42.         for(int i = 0 ; i <= n ; i ++){
  43.             component[i] = i;
  44.             visited[i] = false;
  45.         }
  46.    
  47.         //find node to start dfs write component
  48.         for(int i = 1 ; i <= n ; i ++){
  49.             if(!visited[i]){
  50.                 //dfs
  51.                 stack<int> st;
  52.                 st.push(i);
  53.                 while(!st.empty()){
  54.                     int u = st.top();
  55.                     st.pop();
  56.                     if(visited[u])continue;
  57.                     visited[u] = true;
  58.                     component[u] = i;
  59.                     //adj traversal
  60.                     for(int j = 0 ; j < adj[u].size() ; j ++){
  61.                         int v = adj[u][j].v;
  62.                         int w = adj[u][j].w;
  63.                         if(!visited[v] && w > mid){
  64.                             st.push(v);
  65.                         }
  66.                     }
  67.                 }
  68.             }
  69.         }
  70.         //checking ant
  71.         int check = true;
  72.         for(int i = 1 ; i <= k && check ; i ++){
  73.             if(ant[i].size() <= 1)continue; //always true
  74.             int com = component[ant[i][0]];
  75.             for(int j = 1 ; j < ant[i].size() && check ; j ++){
  76.                 if(component[ant[i][j]] != com){
  77.                     check = false;
  78.                     break;
  79.                 }
  80.             }
  81.         }
  82.        
  83.         if(check){
  84.             if(mid > p)p = mid;
  85.             l = mid + 1;
  86.         }else{
  87.             r = mid - 1;
  88.         }
  89.     }
  90.     l = 0 ; r = m - 1;
  91.     int ans = 0;
  92.     while(l <= r){
  93.         int mid = (l+r)/2;
  94.         if(Alledge[mid] <= p){
  95.             ans = mid + 1;
  96.             l = mid + 1;
  97.         }
  98.         else{
  99.             r = mid - 1;
  100.         }
  101.     }
  102.     printf("%d",ans);
  103.     return 0;
  104. }
Advertisement
Add Comment
Please, Sign In to add comment