Advertisement
RaFiN_

mst but not one edge is maximum

Mar 16th, 2019
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.31 KB | None | 0 0
  1.  
  2. vector<pii>v[MAX];int mata[MAX],edge[2001][2001],table[2001][50],Mx[2001][50],par[2001],cost[2001],lev[2001],vis[2001];
  3.  
  4. int findMata(int s)
  5. {
  6.     if(mata[s]==s)return s;
  7.     return mata[s] = findMata(mata[s]);
  8. }
  9.  
  10. void dfs(int s,int p,int l,int w = 0)
  11. {
  12.     par[s] = p;
  13.     cost[s] = w;
  14.     lev[s] = l;
  15.     vis[s] = 1;
  16.     for(auto it : v[s])
  17.     {
  18.         if(it.ff==p)continue;
  19.         dfs(it.ff,s,l+1,it.ss);
  20.     }
  21.  
  22. }
  23.  
  24. void lca_init(int n)
  25. {
  26.     for(int i = 1;i<=n;i++)
  27.     {
  28.         table[i][0] = par[i];
  29.         Mx[i][0] = cost[i];
  30.     }
  31.     for(int i = 1;i<=n;i++)
  32.     {
  33.         for(int j = 1;(1<<j)<=n;j++)
  34.         {
  35.             if(table[i][j-1]!=-1)
  36.             {
  37.                 table[i][j] = table[table[i][j-1]][j-1];
  38.                 Mx[i][j] = max(Mx[i][j-1],Mx[table[i][j-1]][j-1]);
  39.             }
  40.         }
  41.     }
  42. }
  43.  
  44. int lca_query(int uu,int vv)
  45. {
  46.     if(lev[vv]<lev[uu])swap(uu,vv);
  47.     int log = 1;
  48.     while((1<<log)<lev[vv])log++;
  49.     int mx = 0;
  50.     for(int i = log;i>=0;i--)
  51.     {
  52.         if(lev[vv] - (1<<i)>=lev[uu])
  53.         {
  54.             mx = max(mx,Mx[vv][i]);
  55.             vv = table[vv][i];
  56.         }
  57.     }
  58.     if(uu==vv)return mx;
  59.  
  60.     for(int i = log;i>=0;i--)
  61.     {
  62.         if(table[vv][i]!=-1&&table[vv][i]!=table[uu][i])
  63.         {
  64.             mx = max3(mx,Mx[vv][i],Mx[uu][i]);
  65.             vv = table[vv][i];
  66.             uu = table[uu][i];
  67.         }
  68.     }
  69.     return max3(mx,cost[vv],cost[uu]);
  70. }
  71.  
  72. void CLEAR()
  73. {
  74.     for(int i = 1;i<=2000;i++)v[i].clear();
  75.     mem(edge,0);
  76.     mem(table,0);
  77.     mem(Mx,0);
  78.     mem(par,0);
  79.     mem(cost,0);
  80.     mem(lev,0);
  81.     mem(vis,0);
  82. }
  83.  
  84.  
  85. int main()
  86. {
  87.     ///booster()
  88.     ///read("input.txt");
  89.  
  90.     int n,m;
  91.  
  92.     while(scanf("%d%d",&n,&m)!=EOF)
  93.     {
  94.         CLEAR();
  95.         priority_queue<piii,vector<piii>,greater<piii> >pq;
  96.         for(int i = 1;i<=n;i++)mata[i] = i;
  97.         for(int i = 0;i<m;i++)
  98.         {
  99.             int u,v,l;
  100.             scani3(u,v,l);
  101.             pq.push(piii(l,pii(u,v)));
  102.         }
  103.         ll ans = 0;
  104.         piii save;
  105.         vector<piii>temp;int mx = 0;
  106.         while(!pq.empty())
  107.         {
  108.             piii x = pq.top();
  109.             pq.pop();
  110.             save = x;
  111.             int xx = findMata(x.ss.ff);
  112.             int yy = findMata(x.ss.ss);
  113.             if(xx!=yy)
  114.             {
  115.                 mata[xx] = yy;
  116.                 ans+=x.ff;
  117.                 v[x.ss.ff].pb(pii(x.ss.ss,x.ff));
  118.                 v[x.ss.ss].pb(pii(x.ss.ff,x.ff));
  119.                 edge[x.ss.ff][x.ss.ss] = x.ff;
  120.                 edge[x.ss.ss][x.ss.ff] = x.ff;
  121.                 mx = max(mx,x.ff);
  122.             }
  123.             else temp.pb(x);
  124.         }
  125.         dfs(1,0,0);
  126.         int flag = 0;
  127.         for(int i = 1;i<=n;i++)
  128.         {
  129.             if(!vis[i])
  130.             {
  131.                 flag = 1;
  132.                 break;
  133.             }
  134.         }
  135.         if(flag)
  136.         {
  137.             printf("disconnected\n");
  138.         }
  139.         else
  140.         {
  141.             lca_init(n);
  142.             ll res = ans - 2*mx;
  143.             for(int i = 0;i<temp.size();i++)
  144.             {
  145.                 piii x = temp[i];
  146.                 int pk = lca_query(x.ss.ff,x.ss.ss);
  147.                 res = min(res,ans - pk - x.ff);
  148.             }
  149.  
  150.             printf("%I64d\n",res);
  151.         }
  152.  
  153.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement