求助hack数据
查看原帖
求助hack数据
231800
Veranda楼主2023/11/7 23:07

这份代码可以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;
}
2023/11/7 23:07
加载中...