求调代码,昨天ABC的F
  • 板块题目总版
  • 楼主Zeardoe
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/9/25 10:04
  • 上次更新2023/10/27 10:02:46
查看原帖
求调代码,昨天ABC的F
657765
Zeardoe楼主2022/9/25 10:04
#include<bits/stdc++.h>
#define l first
#define r second
using namespace std;
#define int long long
#define f(i, a, b) for(int i = (a); i <= (b); i++)
#define cl(i, n) i.clear(),i.resize(n);
#define endl '\n'
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
const int inf = 1e9;
int fa[200010];
struct edge{
    int x,y,z;
    edge(){};
    edge(int _x,int _y,int _z):x(_x),y(_y),z(_z){}
}e[600010], nn[600010], ne[600010], en[600010];
int cnt,cntnn,cntne,cnten;
int n,m;
bool cmp(edge x,edge y){return x.z < y.z;}
int get(int x){
    if(fa[x]==x)return x;
    return fa[x]=get(fa[x]);
}
void merge(int x,int y){
    x=get(x),y=get(y);
    fa[x]=y;
}
int ans=0;
int ret=1e18;
signed main() {
    ios::sync_with_stdio(0);
    cin.tie(NULL);
    cout.tie(NULL);
    time_t start = clock();
    //think twice,code once.
    //think once,debug forever.
    cin>>n>>m;
    f(i,1,n){
        int x;cin>>x;
        e[++cnt]=edge(i,n+1,x);
        en[++cnten]=edge(i,n+1,x);
    }
    f(i,1,n){
        int y;cin>>y;
        e[++cnt]=edge(i,n+2,y);
        ne[++cntne]=edge(i,n+2,y);
    }    
    f(i,1,m){
        int a,b,z; cin>>a>>b>>z;
        e[++cnt]=edge(a,b,z);
        en[++cnten]=edge(a,b,z);
        ne[++cntne]=edge(a,b,z);
        nn[++cntnn]=edge(a,b,z);
    }

    sort(e+1,e+cnt+1,cmp);
    sort(en+1,en+cnten+1,cmp);
    sort(ne+1,ne+cntne+1,cmp);
    sort(nn+1,nn+cntnn+1,cmp);

    f(i,1,n+2)fa[i]=i;
    f(i,1,cnt){
        if(get(e[i].x)==get(e[i].y))continue;
        ans+=e[i].z;
        merge(e[i].x,e[i].y);
    }
//    cout << ans << endl;
    ret=min(ret,ans);

    ans=0;
    f(i,1,n+2)fa[i]=i;
    f(i,1,cntnn){
    //    cout << nn[i].x << " " << nn[i].y << " " << nn[i].z << endl;
        if(get(nn[i].x)==get(nn[i].y))continue;
        ans+=nn[i].z;
        merge(nn[i].x,nn[i].y);
    }
    bool ok = 1;
    f(i,1,n)if(fa[i]!=fa[1]){ok=0;break;}
//    cout << ans << endl;
    if(ok)ret=min(ret,ans);

    ans=0;
    f(i,1,n+2)fa[i]=i;
    f(i,1,cntne){
        if(get(ne[i].x)==get(ne[i].y))continue;
        ans+=ne[i].z;
        merge(ne[i].x,ne[i].y);
    }
    ok = 1;
    f(i,1,n+2)if(i!=n+1&&fa[i]!=fa[1]){ok=0;break;}
//    cout << ans << endl;
    if(ok)ret=min(ret,ans);    

    ans=0;
    f(i,1,n+2)fa[i]=i;
    f(i,1,cnten){
        if(get(en[i].x)==get(en[i].y))continue;
        ans+=en[i].z;
        merge(en[i].x,en[i].y);
    }
    ok = 1;
    f(i,1,n+2)if(i!=n+2&&fa[i]!=fa[1]){ok=0;break;}
//    cout << ans << endl;
    if(ok)ret=min(ret,ans);   

    cout<<ret<<endl;    
    time_t finish = clock();
    //cout << "time used:" << (finish-start) * 1.0 / CLOCKS_PER_SEC <<"s"<< endl;
    return 0;
}
2022/9/25 10:04
加载中...