Advertisement
Guest User

Untitled

a guest
Feb 24th, 2017
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.16 KB | None | 0 0
  1.     #include<iostream>
  2.     #include<bits/stdc++.h>
  3.      
  4.     using namespace std;
  5.      
  6.     #define mx 520
  7.     vector<int> g[mx],cost[mx],subgraph[mx],cost_sub[mx];
  8.      
  9.     struct node
  10.     {
  11.         int u,v;
  12.         long long int w;
  13.         node(int a,int c,long long int b){u=a,v=c; w=b;}
  14.         bool operator > ( const node& p ) const { return w > p.w;}
  15.     };
  16.      
  17.     bool visited[mx];
  18.      
  19.     long long int MST_primes(int src,int max_node)
  20.     {
  21.         for(int i=0;i<=max_node;i++)
  22.         {
  23.             subgraph[i].clear();
  24.             cost_sub[i].clear();
  25.         }
  26.      
  27.         long long int total_cost=0,p;
  28.         memset(visited,false,sizeof(visited));
  29.         priority_queue <node,vector<node>, greater<node> > q;
  30.        // Vartex.push_back(src);
  31.        int u;
  32.         for(int i=1;i<max_node;i++)
  33.         {
  34.             if(visited[src]==false){
  35.                       //cout<<34<<endl;
  36.                  u=i;
  37.                 visited[src]=true;
  38.                 for(int j=0;j<g[src].size();j++)
  39.                 {
  40.                     q.push(node(src,g[src][j],cost[src][j]));
  41.                 }
  42.              // cout<<34<<endl;
  43.                 do
  44.                 {
  45.                     if(q.empty())
  46.                         break;
  47.                     node top = q.top();
  48.                     src = top.v;
  49.                     u = top.u;
  50.                     p = top.w;
  51.                    // cout<<u<<" "<<src<<" "<<p<<endl;
  52.                     q.pop();
  53.                 } while(visited[src]==true && !q.empty());
  54.      
  55.      
  56.      
  57.                if(visited[src]==false){
  58.                     //cout<<u<< " "<<src<<endl;
  59.      
  60.                 visited[u]=true;
  61.                 subgraph[u].push_back(src);
  62.                 subgraph[src].push_back(u);
  63.                 cost_sub[u].push_back(p);
  64.                 cost_sub[src].push_back(p);
  65.                }
  66.      
  67.                // Vartex.push_back(src);
  68.      
  69.                // cout<<src<<endl;
  70.      
  71.                 total_cost+=p;
  72.      
  73.         }
  74.      
  75.      
  76.         }
  77.         return total_cost;
  78.     }
  79.      
  80.      
  81.     int bfs(int n,int src)
  82.     {
  83.         queue<int>Q;
  84.         Q.push(src);
  85.         int visited[mx]={0};
  86.         int d[mx];
  87.        for(int i=0;i<=n;i++)
  88.             d[i]=INT_MAX;
  89.         //cout<<d[2]<<endl;
  90.         d[src]=0;
  91.         while(!Q.empty())
  92.         {
  93.             int u=Q.front();
  94.             for(int i=0;i<subgraph[u].size();i++)
  95.             {
  96.                 int v=subgraph[u][i];
  97.                 int cc = max(d[u],cost_sub[u][i]);
  98.                 if(d[v]>cc)
  99.                 {
  100.                     //cout<<minimum[u]<<" "<<cost_sub[u][i]<<endl;
  101.                     d[v]=cc;
  102.                    // visited[v]=true;
  103.                     Q.push(v);
  104.                 }
  105.             }
  106.             Q.pop();
  107.         }
  108.         for(int i=0;i<n;i++)
  109.         {
  110.             if(d[i]==INT_MAX)
  111.                 printf("Impossible\n");
  112.             else
  113.                 printf("%d\n",d[i]);
  114.         }
  115.         return 0;
  116.     }
  117.      
  118.      
  119.     int main()
  120.     {
  121.     //    Vartex.clear();
  122.      
  123.         //freopen("in.txt","r",stdin);
  124.      
  125.         int u,v,w,n,e,test,des;
  126.         cin>>test;
  127.         for(int Case = 1; Case<=test ; Case++)
  128.         {
  129.             scanf("%d %d",&n,&e);
  130.             for(int i=0;i<=n;i++)
  131.             {
  132.                 g[i].clear();
  133.                 cost[i].clear();
  134.             }
  135.      
  136.             for(int i=0;i<e;i++)
  137.             {
  138.                 scanf("%d %d %d",&u,&v,&w);
  139.                 g[u].push_back(v);
  140.                 g[v].push_back(u);
  141.                 cost[u].push_back(w);
  142.                 cost[v].push_back(w);
  143.      
  144.             }
  145.            /* for(int i=0;i<n;i++)
  146.             {
  147.                 //cout<<i<<" : ";
  148.                 for(int j=0;j<g[i].size();j++)
  149.                     cout<<i<<" ->> "<<g[i][j]<<"-->>"<<cost[i][j]<<endl;
  150.                 cout<<endl;
  151.             }*/
  152.      
  153.             scanf("%d",&des);
  154.             //cout<<"MST"<<endl;
  155.             MST_primes(des,n);
  156.      
  157.             printf("Case %d:\n",Case);
  158.             bfs(n,des);
  159.      
  160.         }
  161.      
  162.      
  163.      
  164.         return 0;
  165.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement