社区讨论

玄学存图+手打堆优化+dij不知为何错了。。。

P4779【模板】单源最短路径(标准版)参与者 3已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mi7df03v
此快照首次捕获于
2025/11/20 19:51
4 个月前
此快照最后确认于
2025/11/20 19:51
4 个月前
查看原帖
RT
代码:
CPP
#include<iostream>
#include<map>
using namespace std;
struct note
{
    long long size,go;
};
map<long long,note>a[200001];
long long the_max;
long long n,m,k,data[200001],x,y,z,mindata,minnum,num[200001],aa[200001],zx[100001],r;
bool jl[200001];

void newswap(long long &x,long long &y)
{
    long long t=x;
    x=y;
    y=t;
    t=zx[x];
    zx[x]=zx[y];
    zx[y]=t;
}

void wh(long long x)
{
    if (2*x<=r && (data[aa[2*x-1]]<data[aa[x]] || data[aa[2*x]]<data[aa[x]]))
    {
        if (data[aa[2*x-1]]<data[aa[2*x]])
        {
            newswap(aa[2*x-1],aa[x]);
            wh(2*x-1);
        }
        else 
        {
            newswap(aa[2*x],aa[x]);
            wh(2*x);
        }
    }
    else if (2*x-1<=r && (data[aa[2*x-1]]<data[aa[x]]))
    {
        newswap(aa[2*x-1],aa[x]);
        wh(2*x-1);
    }
    if (data[aa[(x+1)/2]]>data[aa[x]])
    {
        newswap(aa[(x+1)/2],aa[x]);
        wh((x+1)/2);
    }
}

void puts(long long x)
{
    aa[++r]=x;
    wh(r);
}

void del()
{
    aa[1]=aa[r];
    r--;
    wh(1);
}

int main()
{
    the_max=2305843009213693952;
    cin>>n>>m>>k;
    r=n;
    for (long long i=1;i<=n;i++) data[i]=the_max,aa[i]=i,zx[i]=i;
    data[k]=0;
    wh(k);
    for (long long i=1;i<=m;i++)
    {
        cin>>x>>y>>z;
        num[x]++;
        a[x][num[x]].size=z;
        a[x][num[x]].go=y;
    }
    for (long long i=1;i<=n;i++)
    {
    	k=aa[1];
    	del();
    	jl[k]=true;
        for (long long j=1;j<=num[k];j++) 
        if (!jl[a[k][j].go])
        if (data[a[k][j].go]>data[k]+a[k][j].size)
        {
            data[a[k][j].go]=data[k]+a[k][j].size;
            wh(zx[a[k][j].go]);
        }
    }
    for (long long i=1;i<=n;i++) cout<<data[i]<<' ';
    return 0;
}

回复

3 条回复,欢迎继续交流。

正在加载回复...