1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
#include<bits/stdc++.h> using namespace std;
typedef long long ll; const int N=2010, M=20010; const ll INF=1e18;
struct Edge{ int a, b; ll w; bool f; bool operator<(const Edge&t)const{ return w<t.w; } }edge[M]; int p[N];
int find(int x){ if(p[x]!=x) p[x]=find(p[x]); return p[x]; }
int h[N], e[2*M], ne[2*M], idx; ll w[2*M];
void add(int a, int b, ll c){ e[idx]=b, w[idx]=c, ne[idx]=h[a], h[a]=idx++; }
ll dist[N][N]; void dfs(int u, int fa, ll maxd, ll d[]){ d[u]=maxd; for(int i=h[u];~i;i=ne[i]){ int j=e[i]; if(j!=fa){ dfs(j, u, max(w[i], maxd), d); } } }
int n, m;
void work(){ scanf("%d%d", &n, &m);
for(int i=1;i<=n;i++) p[i]=i;
for(int i=0;i<m;i++){ int a, b; ll c; scanf("%d%d%lld", &a, &b, &c); edge[i]={a, b, c, false}; }
sort(edge, edge+m);
ll sum=0; memset(h, -1, sizeof h); for(int i=0;i<m;i++){ int a=find(edge[i].a), b=find(edge[i].b); ll c=edge[i].w; if(a!=b){ p[a]=b; sum+=c; add(edge[i].a, edge[i].b, c), add(edge[i].b, edge[i].a, c); edge[i].f=true; } }
for(int i=1;i<=n;i++) dfs(i, -1, 0, dist[i]);
ll res=INF; for(int i=0;i<m;i++){ if(!edge[i].f){ int a=edge[i].a, b=edge[i].b; ll c=edge[i].w; if(c>dist[a][b]) res=min(res, sum+c-dist[a][b]); } }
printf("%lld\n", res); }
int main(){ work(); return 0; }
|