社区讨论

dijkstra算法加堆优化,只过一个点

P3371【模板】单源最短路径(弱化版)参与者 6已保存回复 6

讨论操作

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

当前回复
6 条
当前快照
1 份
快照标识符
@mi6henzs
此快照首次捕获于
2025/11/20 04:55
4 个月前
此快照最后确认于
2025/11/20 04:55
4 个月前
查看原帖
CPP
#include <iostream>
#include <vector>
using namespace std;
struct node
{
    long cost,id;
};
vector <node> photo[10001];
long dist[10001];
long heap[10001];
long flag[10001];
int n,m,s;
int f,g,w;
long len;
void swap(int i,int j)
{
    int temp;
    temp=heap[i];
    heap[i]=heap[j];
    heap[j]=temp;
}
void up(int i)
{
    if(i==1) return;
    if(dist[heap[i]]<dist[heap[i/2]])
    {
        swap(i,i/2);
        up(i/2);
    }
}
void down(int i)
{
    if(2*i>len) return;
    int minn=2*i;
    if(minn+1<=len&&dist[heap[minn]]>dist[heap[minn+1]])
    {
        minn=minn+1;
    }
    if(dist[heap[minn]]<dist[heap[i]])
    {
        swap(minn,i);
        down(minn);
    }
}
void getdata()
{
    cin>>n>>m>>s;
    node x;
    for(int i=1;i<=m;i++)
    {
        cin>>f>>g>>w;
        x.id=g;
        x.cost=w;
        photo[f].push_back(x);
    }
}
void dijkstra()
{
    for(int i=1;i<=n;i++)
    {
        flag[i]=0;
        dist[i]=2147483647;
    }
    dist[s]=0;
    flag[s]=1;
    len=0;
    for(int i=0;i<photo[s].size();i++)
    {
        int nxtv=photo[s][i].id;
        long cost=photo[s][i].cost;
        dist[nxtv]=cost;
        heap[++len]=nxtv;
        up(len);
    }
    for(int k=1;k<n;k++)
    {
        int temp;
        while(len>0)
        {
            temp=heap[1];
            swap(1,len);
            len--;
            down(1);
            if(flag[temp]==0) break;
        }
        //if(flag[temp]==1) break;
        flag[temp]=1;
        for(int i=0;i<photo[temp].size();i++)
        {
            int nxtv=photo[temp][i].id;
            long cost=photo[temp][i].cost;
            if(dist[nxtv]>dist[temp]+cost)
            {
                dist[nxtv]=dist[temp]+cost;
                heap[++len]=nxtv;
                up(len);
            }
        }
    }
}
int main()
{
    getdata();
    dijkstra();
    for(int i=1;i<=n;i++)
        cout<<dist[i]<<" ";
    return 0;
}

回复

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

正在加载回复...