记录编号 388984 评测结果 AAAAAAAAAA
题目名称 次小生成树 最终得分 100
用户昵称 Gravatarrewine 是否通过 通过
代码语言 C++ 运行时间 0.556 s
提交时间 2017-03-30 10:53:14 内存使用 165.87 MiB
显示代码纯文本
#include <cstdio>
#include <queue>
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

typedef long long LL; 
inline void read(int &x) {
    static char c;bool flag = 0;
    while((c=getchar())<'0'||c>'9') flag |= (c=='-');
    x=c-'0';while((c=getchar())>='0'&&c<='9') x = x*10+c-'0';
    flag?x=-x:x;
}

#define N 310000

int n,m;
struct E {
	int to,w,next;
	E(int to=0,int w=0,int next=0):to(to),w(w),next(next){} 
}g[N*2];
int fr[N],tot;

void Add(int from,int to,int w) {
	g[++tot] = E(to,w,fr[from]);
	fr[from] = tot;
}

struct Da{int u,v,w,used;}a[N];
bool cmp(const Da &a,const Da &b) {return a.w<b.w;}
int f[N];
LL ans,det = ~0u>>2;

int find(int x) {
	return x==f[x]?x:f[x]=find(f[x]);
}

LL dep[N],fa[N][20+1],maxn[N][20+1],cmax[N][20+1];

void dfs(int t) {
	for (int i = fr[t]; i; i = g[i].next) {
		int to = g[i].to;
		if(to == fa[t][0]) continue;
		dep[to] = dep[t]+1;
		fa[to][0] = t; maxn[to][0] = g[i].w; 
		dfs(to);
	}
}

void init() {
	for (int j = 1; j < 20; j++)
	 for (int i = 1; i <= n; i++) {
	 	fa[i][j] = fa[fa[i][j-1]][j-1];
	 	if(fa[i][j]==0) continue;
	 	maxn[i][j] = max(maxn[i][j-1],maxn[fa[i][j-1]][j-1]);
	 	cmax[i][j] = max(cmax[i][j-1],cmax[fa[i][j-1]][j-1]);
	 	if(maxn[i][j-1] != maxn[fa[i][j-1]][j-1])
	 	  cmax[i][j] = max(cmax[i][j],min(maxn[i][j-1],maxn[fa[i][j-1]][j-1]));
	 }
}

LL ma,cm; 

void adjust(int &u,int deep) {
	for (int j = 20; j; j--)
	 if(dep[fa[u][j]] >= deep) {
	 	ma = max(ma,maxn[u][j]);
	    cm = max(cm,cmax[u][j]);
		u = fa[u][j];
	 }
}

void Try_add(int u,int v,int w) {
	ma = 0,cm = 0;
	if(dep[u] < dep[v]) swap(u,v);
	adjust(u,dep[v]);

    if(u != v) {
	  for (int j = 20; j; j--) 
	    if (fa[u][j] != fa[v][j]) {
	    	ma = max(ma,max(maxn[u][j],maxn[v][j]));
	        cm = max(cm,max(cmax[u][j],cmax[v][j]));
	     	u = fa[u][j]; v = fa[v][j]; 
	    }
	    ma = max(ma,max(maxn[u][0],maxn[v][0]));
	    cm = max(cm,max(cmax[u][0],cmax[v][0]));
	}
//cout<<" "" "<<w<<" "<<ma<<" "<<cm<<"\n";
	if(w > ma) det = min(det,w-ma);
	if(w > cm) det = min(det,w-cm);
}

int main() {
	freopen("secmst.in","r",stdin); freopen("secmst.out","w",stdout);
    read(n); read(m);
    for (int i = 1; i <= n; i++) f[i] = i; 
    for (int i = 1; i <= m; i++) 
    	read(a[i].u),read(a[i].v),read(a[i].w);
    sort(a+1,a+m+1,cmp);
	for (int i = 1; i <= m; i++) {
		int u = find(a[i].u),v = find(a[i].v);
		if(u != v) {
			f[u] = v; ans += a[i].w;
			a[i].used = 1;
			Add(u,v,a[i].w); Add(v,u,a[i].w);
		}
	}
	dep[1] = 1; dfs(1); init(); 
	for (int i = 1; i <= m; i++) 
	  if(!a[i].used) Try_add(a[i].u,a[i].v,a[i].w);
	printf("%lld\n",ans+det); 
    return 0;
}