Advertisement
SuitNdtie

MBST

Mar 27th, 2019
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.46 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<vector>
  3. #include<algorithm>
  4. #include<queue>
  5. using namespace std;
  6. int set[1010];
  7. struct edge{
  8.     int u,v,w;
  9. };
  10. bool mycmp(edge a,edge b){
  11.     return a.w < b.w;
  12. }
  13. int find(int x){
  14.     if(set[x] == x)return x;
  15.     return set[x] = find(set[x]);
  16. }
  17. void unions(int x,int y){
  18.     int sx = find(x);
  19.     int sy = find(y);
  20.     set[sx] = sy;
  21. }
  22. int max(int a,int b){
  23.     return (a > b ? a : b);
  24. }
  25.  
  26. int main()
  27. {
  28.     for(int i=0;i<1010;i++)set[i] = i;
  29.     int n,m;
  30.     scanf("%d %d",&n,&m);
  31.     vector<edge> edges;
  32.     vector<pair<int,int> > adj[n+1];
  33.     for(int i=0;i<m;i++){
  34.         int u,v,w;
  35.         scanf("%d %d %d",&u,&v,&w);
  36.         edges.push_back({u,v,w});
  37.         adj[u].push_back({w,v});
  38.         adj[v].push_back({w,u});
  39.     }
  40.     sort(edges.begin(),edges.end(),mycmp);
  41.     int MST = 0;
  42.     int maxw = 0;
  43.     for(int i=0;i<edges.size();i++){
  44.         int u = edges[i].u;
  45.         int v = edges[i].v;
  46.         int w = edges[i].w;
  47.         if(find(u) != find(v)){
  48.             unions(u,v);
  49.             MST += w;
  50.             maxw = max(maxw,w);
  51.         }
  52.     }
  53.     int MBST = 0;
  54.    
  55.     bool visited[n+1];for(int i=0;i<=n;i++)visited[i] = false;
  56.     queue<int> q;
  57.     q.push(1);
  58.     while(!q.empty()){
  59.         int u = q.front();
  60.         q.pop();
  61.         if(visited[u]){
  62.     //      printf("Test %d\n",u);
  63.             MBST = 1;
  64.             break;
  65.         }else{
  66.             visited[u] = true;
  67.             for(int i=0;i<adj[u].size();i++){
  68.                 int v = adj[u][i].second;
  69.                 int w = adj[u][i].first;
  70.                 if(w <= maxw && !visited[v]){
  71.             //      printf("Test pushed %d\n",v);
  72.                     q.push(v);
  73.                 }
  74.             }
  75.         }
  76.     }
  77.    
  78.    
  79.     printf("%d %d",MST,MBST);
  80. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement