这份代码可以AC,但是可以被hack掉
hack数据:
4 4
1 2 1
2 3 2
3 4 1
2 4 2
应输出 5,实际输出 1061109573
求助错在哪(((
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long LL;
const int N = 100010;
const int M = 300010;
const int inf = 0x3f3f3f3f;
const int K = 17;
struct edges{
int a,b,c;
bool vis;
bool operator< (const edges &t) const{
return c < t.c;
}
}edge[M];
int n,m;
int h[N],e[M],ne[M],w[M],idx;
int fa[N][K],d1[N][K],d2[N][K];
int dep[N];
int p[N];
int find(int x){
if(p[x] != x) p[x] = find(p[x]);
return p[x];
}
void add(int a,int b,int c){
e[idx] = b,ne[idx] = h[a],w[idx] = c,h[a] = idx ++;
}
void dfs(int u,int f,int d){
dep[u] = d;
for(int i = h[u];~i;i = ne[i]){
int j = e[i],val = w[i];
if(j == f) continue;
fa[j][0] = u;
d1[j][0] = val;
d2[j][0] = -inf;
for(int k = 1;k <= 16;k ++){
int anc = fa[j][k - 1];
fa[j][k] = fa[anc][k - 1];
int dis1a = d1[j][k - 1],dis2a = d2[j][k - 1];
int dis1b = d1[anc][k - 1],dis2b = d2[anc][k - 1];
int dist[4] = {dis1a,dis2a,dis1b,dis2b};
d1[j][k] = d2[j][k] = -inf;
for(int l = 0;l < 4;l ++){
int de = dist[l];
if(de > d1[j][k]) d2[j][k] = d1[j][k],d1[j][k] = de;
else if(de != d1[j][k] && d > d2[j][k]) d2[j][k] = de;
}
}
dfs(j,u,d + 1);
}
}
int lca(int a,int b,int c){
static int distance[N * 2];
int cnt = 0;
if(dep[a] < dep[b]) swap(a,b);
for(int k = 16;k >= 0;k --){
if(dep[fa[a][k]] >= dep[b]){
distance[++ cnt] = d1[a][k];
distance[++ cnt] = d2[a][k];
a = fa[a][k];
}
}
if(a != b){
for(int k = 16;k >= 0;k --){
if(fa[a][k] != fa[b][k]){
distance[++ cnt] = d1[a][k];
distance[++ cnt] = d2[a][k];
distance[++ cnt] = d1[b][k];
distance[++ cnt] = d2[b][k];
a = fa[a][k],b = fa[b][k];
}
}
distance[++ cnt] = d1[a][0];
distance[++ cnt] = d2[b][0];
}
int dis1 = -inf,dis2 = -inf;
for(int i = 1;i <= cnt;i ++){
int d = distance[i];
//cout << d << endl;
if(d > dis1) dis2 = dis1,dis1 = d;
else if(d != dis1 && d > dis2) dis2 = d;
}
if(c > dis1) return c - dis1;
if(c > dis2) return c - dis2;
return inf;
}
int main(){
memset(h,-1,sizeof h);
cin >> n >> m;
for(int i = 1;i <= m;i ++){
cin >> edge[i].a >> edge[i].b >> edge[i].c;
}
for(int i = 1;i <= n;i ++) p[i] = i;
sort(edge + 1,edge + m + 1);
int cnt = 0;
LL sum = 0;
for(int i = 1;i <= m;i ++){
int u = edge[i].a,v = edge[i].b,w = edge[i].c;
int ancu = find(u),ancv = find(v);
if(ancu != ancv){
p[ancu] = ancv;
add(u,v,w);
add(v,u,w);
cnt ++;
sum += w;
edge[i].vis = 1;
}
//if(cnt == n - 1) break;
}
memset(dep,0x3f,sizeof dep);
dep[0] = 0;
dfs(1,-1,1);
LL res = 1e18;
for(int i = 1;i <= m;i ++){
if(!edge[i].vis){
int a = edge[i].a,b = edge[i].b,c = edge[i].c;
res = min(res,sum + lca(a,b,c));
}
}
cout << res;
return 0;
}