Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- vector<pii>v[MAX];int mata[MAX],edge[2001][2001],table[2001][50],Mx[2001][50],par[2001],cost[2001],lev[2001],vis[2001];
- int findMata(int s)
- {
- if(mata[s]==s)return s;
- return mata[s] = findMata(mata[s]);
- }
- void dfs(int s,int p,int l,int w = 0)
- {
- par[s] = p;
- cost[s] = w;
- lev[s] = l;
- vis[s] = 1;
- for(auto it : v[s])
- {
- if(it.ff==p)continue;
- dfs(it.ff,s,l+1,it.ss);
- }
- }
- void lca_init(int n)
- {
- for(int i = 1;i<=n;i++)
- {
- table[i][0] = par[i];
- Mx[i][0] = cost[i];
- }
- for(int i = 1;i<=n;i++)
- {
- for(int j = 1;(1<<j)<=n;j++)
- {
- if(table[i][j-1]!=-1)
- {
- table[i][j] = table[table[i][j-1]][j-1];
- Mx[i][j] = max(Mx[i][j-1],Mx[table[i][j-1]][j-1]);
- }
- }
- }
- }
- int lca_query(int uu,int vv)
- {
- if(lev[vv]<lev[uu])swap(uu,vv);
- int log = 1;
- while((1<<log)<lev[vv])log++;
- int mx = 0;
- for(int i = log;i>=0;i--)
- {
- if(lev[vv] - (1<<i)>=lev[uu])
- {
- mx = max(mx,Mx[vv][i]);
- vv = table[vv][i];
- }
- }
- if(uu==vv)return mx;
- for(int i = log;i>=0;i--)
- {
- if(table[vv][i]!=-1&&table[vv][i]!=table[uu][i])
- {
- mx = max3(mx,Mx[vv][i],Mx[uu][i]);
- vv = table[vv][i];
- uu = table[uu][i];
- }
- }
- return max3(mx,cost[vv],cost[uu]);
- }
- void CLEAR()
- {
- for(int i = 1;i<=2000;i++)v[i].clear();
- mem(edge,0);
- mem(table,0);
- mem(Mx,0);
- mem(par,0);
- mem(cost,0);
- mem(lev,0);
- mem(vis,0);
- }
- int main()
- {
- ///booster()
- ///read("input.txt");
- int n,m;
- while(scanf("%d%d",&n,&m)!=EOF)
- {
- CLEAR();
- priority_queue<piii,vector<piii>,greater<piii> >pq;
- for(int i = 1;i<=n;i++)mata[i] = i;
- for(int i = 0;i<m;i++)
- {
- int u,v,l;
- scani3(u,v,l);
- pq.push(piii(l,pii(u,v)));
- }
- ll ans = 0;
- piii save;
- vector<piii>temp;int mx = 0;
- while(!pq.empty())
- {
- piii x = pq.top();
- pq.pop();
- save = x;
- int xx = findMata(x.ss.ff);
- int yy = findMata(x.ss.ss);
- if(xx!=yy)
- {
- mata[xx] = yy;
- ans+=x.ff;
- v[x.ss.ff].pb(pii(x.ss.ss,x.ff));
- v[x.ss.ss].pb(pii(x.ss.ff,x.ff));
- edge[x.ss.ff][x.ss.ss] = x.ff;
- edge[x.ss.ss][x.ss.ff] = x.ff;
- mx = max(mx,x.ff);
- }
- else temp.pb(x);
- }
- dfs(1,0,0);
- int flag = 0;
- for(int i = 1;i<=n;i++)
- {
- if(!vis[i])
- {
- flag = 1;
- break;
- }
- }
- if(flag)
- {
- printf("disconnected\n");
- }
- else
- {
- lca_init(n);
- ll res = ans - 2*mx;
- for(int i = 0;i<temp.size();i++)
- {
- piii x = temp[i];
- int pk = lca_query(x.ss.ff,x.ss.ss);
- res = min(res,ans - pk - x.ff);
- }
- printf("%I64d\n",res);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement