prim堆优化炸了

P3366 【模板】最小生成树

A_sh @ 2021-09-26 15:20:37

我的prim堆优化炸了三个点;

然鹅kruscal好好的;

acwing上交了一遍也是三个点炸;

貌似是连通图输出了orz;

但是找不到错误,求助;

贴码

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define inf 0x3f3f3f
const int N=1010,M=114514;

priority_queue< pair<int,int> > q;
int ans,tot;
int d[N],h[N],e[M],ne[M],v[M];
bool vis[M];
int m,n;

void add(int x,int y,int z){
    v[++tot]=y,e[tot]=z,ne[tot]=h[x],h[x]=tot;
}
inline void prim(){
    q.push(make_pair(0,1));
    int cnt=0,sum=0;
    while(q.size()){
        int x=q.top().second,dst=q.top().first;
        q.pop();
        if(vis[x])continue;//寻找更新点 
        vis[x]=1;
        sum-=dst;
        cnt++;
        for(int i=h[x];i;i=ne[i]){//-1
            if(!vis[v[i]]){
                q.push(make_pair(-e[i],v[i]));
            }
        }
    }
    if(cnt==n)printf("%lld",sum);
    else printf("orz"); 
}
inline int qr(){
    int res=0,f=1;char ch=getchar();
    while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){res=(res<<1)+(res<<3)+(ch^48);ch=getchar();}
    return res*f;
}
signed main(){
    n=qr();m=qr();
    for(int i=1;i<=m;i++){
        int x=qr(),y=qr(),z=qr();
        add(x,y,z);
        add(y,x,z);
    }
    prim();
    return 0;
}

by うっせぇわ @ 2021-09-26 18:04:09

这么臭的M有存在的必要吗(


by _SeeleVollerei_ @ 2021-09-26 18:19:29

@lzx201720550 是不是N开小了 题目不是5k吗


by _SeeleVollerei_ @ 2021-09-26 18:22:34

@lzx201720550 M也没开够


by A_sh @ 2021-09-26 18:34:00

@泷泽三月

https://www.luogu.com.cn/record/58605515

感谢调试;

然而我这个数据范围是acwing上粘过来的;

可能是因为那个网页5000去掉了个0;

总之orz orz orz


|