Nur_Mohammed_Mehedy

Is There A Second Way Left?

Apr 9th, 2021
1,340
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.72 KB | None | 0 0
  1.  
  2. #include<bits/stdc++.h>
  3. #include<string.h>
  4.  
  5. using namespace std;
  6.  
  7. #define pb          push_back
  8. #define ff          first
  9. #define sc          second
  10.  
  11. typedef long long ll;
  12.  
  13. #define scc(n) scanf("%d",&n);
  14. #define sccc(n) scanf("%lld",&n);
  15.  
  16. const int N=300,mod=998244353;
  17.  
  18. int nodes,edges;
  19. bool edges_on_mst[N];
  20. bool take_me[N];
  21.  
  22. vector< pair<int, pair<int,int> > > all_edges;
  23.  
  24. int second_mst()
  25. {
  26.     bool taken[N];
  27.     memset(taken , 0, sizeof taken);
  28.  
  29.     vector< pair<int,int> > adj[N];
  30.  
  31.     for(int i=0;i<edges;i++)
  32.     {
  33.         if(!take_me[i])
  34.         {
  35.             int c,s,e;
  36.  
  37.             c = all_edges[i].ff;
  38.             s = all_edges[i].sc.ff;
  39.             e = all_edges[i].sc.sc;
  40.  
  41.             adj[s].pb({e,c});
  42.             adj[e].pb({s,c});
  43.         }
  44.     }
  45.  
  46.     priority_queue< pair<int,int> >q;
  47.     int ans=0;
  48.  
  49.     taken[1]=1;
  50.     for(auto [node,weight]:adj[1])
  51.     {
  52.         if(!taken[node])
  53.             q.push({-weight,node});
  54.     }
  55.  
  56.     while(!q.empty())
  57.     {
  58.         int cost = -q.top().ff;
  59.         int next = q.top().sc;
  60.  
  61.         q.pop();
  62.  
  63.         if(!taken[next])
  64.         ans += cost;
  65.  
  66.         taken[next]=1;
  67.         for(auto [node,cost]:adj[next])
  68.         {
  69.             if(!taken[node])
  70.                 q.push({-cost,node});
  71.         }
  72.     }
  73.  
  74.     for(int i=1;i<=nodes;i++) if(taken[i]==0)return INT_MAX;
  75.  
  76.     return ans;
  77. }
  78.  
  79.  
  80. int mst()
  81. {
  82.     bool taken[N];
  83.     memset(taken , 0, sizeof taken);
  84.  
  85.     vector< pair<int , pair<int,int> > > adj[N]; /// index of the edge , next , cost
  86.  
  87.     for(int i=0;i<edges;i++)
  88.     {
  89.         int c,s,e;
  90.  
  91.         c = all_edges[i].ff;
  92.         s = all_edges[i].sc.ff;
  93.         e = all_edges[i].sc.sc;
  94.  
  95.         adj[s].pb({i,{e,c}});
  96.         adj[e].pb({i,{s,c}});
  97.     }
  98.  
  99.     priority_queue< pair< pair<int,int> , int > >q; /// cost , next , index of the edge
  100.  
  101.     int ans=0;
  102.  
  103.     taken[1]=1;
  104.     for(auto [i,k]:adj[1])
  105.     {
  106.         if(!taken[k.ff])
  107.             q.push( { { -k.sc, k.ff}, i} ); /// k.ff = cost , k.sc = next node;
  108.     }
  109.  
  110.     while(!q.empty())
  111.     {
  112.         int cost = -q.top().ff.ff;
  113.         int next = q.top().ff.sc;
  114.         int edge_number = q.top().sc;
  115.  
  116.         q.pop();
  117.  
  118.         if(!taken[next])
  119.         {
  120.             edges_on_mst[edge_number] = 1;
  121.             ans += cost;
  122.         }
  123.  
  124.         taken[next]=1;
  125.         for(auto [i,k]:adj[next])
  126.         {
  127.             if(!taken[k.ff])
  128.                 q.push( { { -k.sc, k.ff}, i} ); /// k.ff = cost , k.sc = next node;
  129.         }
  130.     }
  131.  
  132.     for(int i = 1;i<=nodes; i++) if(taken[i]==0)return -1;
  133.  
  134.     return ans;
  135. }
  136.  
  137. int main()
  138. {
  139. //    ios::sync_with_stdio(0);
  140. //    cin.tie(NULL);
  141.  
  142.     int _,t=1;
  143.     scc(_);
  144.     while(_--)
  145.     {
  146.         memset(edges_on_mst, 0,sizeof edges_on_mst);
  147.         memset(take_me,0,sizeof take_me);
  148.         all_edges.clear();
  149.  
  150.  
  151.         scc(nodes)
  152.         scc(edges)
  153.  
  154.         int i, second_best_mst = INT_MAX;
  155.  
  156.         for(i = 1; i<= edges; i++)
  157.         {
  158.             int c,s,e;
  159.  
  160.             scc(s)
  161.             scc(e)
  162.             scc(c)
  163.  
  164.             all_edges.pb({c,{s,e}});
  165.         }
  166.  
  167.         int cost_of_mst = mst();
  168.  
  169.         for(i=0;i<edges;i++)
  170.         {
  171.             if(edges_on_mst[i])
  172.             {
  173.                 take_me[i] = 1;
  174.  
  175.                 second_best_mst = min(second_best_mst , second_mst());
  176.  
  177.                 take_me[i] = 0;
  178.             }
  179.         }
  180.  
  181.         printf("Case #%d : ",t++);
  182.  
  183.         if(cost_of_mst == -1)
  184.         {
  185.             puts("No way");
  186.         }
  187.         else if(second_best_mst == INT_MAX)
  188.         {
  189.             puts("No second way");
  190.         }
  191.         else
  192.         {
  193.             printf("%d\n",second_best_mst);
  194.         }
  195.  
  196.     }
  197.  
  198.     return 0;
  199. }
  200.  
  201.  
Advertisement
Add Comment
Please, Sign In to add comment