52pts 求调
查看原帖
52pts 求调
1072078
wedngda楼主2024/8/30 04:01

由于本人不会重载运算符所以手写了一个巨丑而且常数巨大的堆,然而这不是重点,重点是只过了一半另一半WA 还有一个问题,就是开了O2之后会全部MLE,不开还能跑,不知道为什么

#include<bits/stdc++.h>
using namespace std;
#define N 200010
#define INF 1000000001
int n,m,s;
int head[N<<1],nxt[N<<2],to[N<<2],w[N<<2],cnt=0;
int heap[N],id[N],point[N],sz=0;
void build()
{
    for(int i=1;i<=n;i++) heap[i]=INF,id[i]=i,point[i]=i;
    sz=n;
}
void swp(int x,int y)
{
    swap(heap[x],heap[y]);
    swap(point[id[x]],point[id[y]]);
    swap(id[x],id[y]);
}
void del(int k)
{
    int t=point[k];
    swp(t,sz);
    sz--;
    while((t<<1)<=sz)
    {
        if((t<<1)+1<=sz)
        {
            if(heap[t<<1]<heap[(t<<1)+1]) swp(t<<1,t),t<<=1;
            else swp((t<<1)+1,t),t=(t<<1)+1;
        }
        else if((t<<1)<=sz) swp(t<<1,t),t<<=1;
        else break;
    }
}
void add(int k,int val)
{
    heap[++sz]=val;
    id[sz]=k;
    point[k]=sz;
    int t=sz;
    while(t>>1>0)
    {
        if(heap[t>>1]>heap[t]) swp(t>>1,t),t>>=1;
        else break;
    }
}
void change(int k,int val)
{
    del(k);
    add(k,val);
}
int pop()
{
    int tmp=id[1];
    del(tmp);
    return tmp;
}
int make(int u,int v,int wi)
{
    nxt[++cnt]=head[u];
    to[cnt]=v;
    w[cnt]=wi;
    head[u]=cnt;
}
int main()
{
    cin>>n>>m>>s;
    build();
    int u,v,wi;
    for(int i=1;i<=m;i++)
    {
        cin>>u>>v>>wi;
        make(u,v,wi);
        make(v,u,wi);
    }
    int vis[N]={0},dis[N];
    for(int i=1;i<=n;i++) dis[i]=INF;
    int _cnt=n;
    dis[s]=0;
    change(s,0);
    pop();
    while(--_cnt)
    {
        vis[s]=1;
        for(int i=head[s];i!=0;i=nxt[i])
        {
            if(!vis[to[i]]&&dis[s]+w[i]<dis[to[i]]) dis[to[i]]=dis[s]+w[i],change(to[i],dis[to[i]]);
        }
        s=pop();
    }
    for(int i=1;i<=n;i++) cout<<dis[i]<<' ';
}
2024/8/30 04:01
加载中...