60pts求助
查看原帖
60pts求助
315205
Kniqht楼主2022/10/28 08:51

孩子调了半天了。。。思路同第一篇题解(其实是自己写错了照着改的,但是改了也只有60pts)

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e6+10;
int n,m,g[N],q[N],ans,cnt,ccnt;
int h[N],w[N],e[N],ne[N],idx,p[N];
bool st[N];
void add(int a,int b,int c){e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;}
int find(int x){return p[x]==x?x:p[x]=find(p[x]);}
struct edge{int x,y,w1,w2;}edges[N];
bool cmp(edge x1,edge x2){return x1.w1==x2.w1?x1.w2<x2.w2:x1.w1>x2.w1;}
void Bfs(){
    int hh=0,tt=-1;
    st[1]=1;q[++tt]=1;
    while(hh<=tt){
        int t=q[hh++];
        for(int i=h[t];~i;i=ne[i]){
            int j=e[i];
            edges[++m]=edge{t,j,g[j],w[i]};
            if(st[j]) continue;
            st[j]=true;ccnt++;
            q[++tt]=j;
        }
    }
}
signed main(){
    memset(h,-1,sizeof(h));
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<=n;i++) scanf("%lld",&g[i]),p[i]=i;
    while(m--){
        int a,b,c;
        scanf("%lld%lld%lld",&a,&b,&c);
        if(g[a]>=g[b]) add(a,b,c);
        if(g[a]<=g[b]) add(b,a,c);
    }
    Bfs();
    sort(edges+1,edges+m+1,cmp);
    for(int i=1;i<=m;i++){
        int tx=edges[i].x,ty=edges[i].y,dis=edges[i].w2;
        int px=find(tx),py=find(ty);
        if(px!=py){
            p[px]=py;
            ans+=dis;
        }
    }
    printf("%lld %lld",ccnt+1,ans);
    return 0;   
}
2022/10/28 08:51
加载中...