怎么堆优化后的dijkstra一个点也没过呀
查看原帖
怎么堆优化后的dijkstra一个点也没过呀
817442
Sakuya_maid楼主2023/3/9 09:26

堆优化前朴素版本的能过七个点,三个re,堆优化后的dijkstra能过本题的标准版本,但是弱化版本一个都过不去,很奇怪捏

#include<bits/stdc++.h>
using namespace std;

typedef pair<int,int>PII;

const int N=200010;

int h[N],e[N],ne[N],idx;
int w[N];
int dist[N];
bool st[N];

int n,m,s;

void add(int x,int y,int c)
{
    w[idx]=c;
    e[idx]=y;
    ne[idx]=h[x];
    h[x]=idx++;
}

void dijkstra()
{
    priority_queue<PII,vector<PII>,greater<PII>>heap;

    heap.push({0,1});

    while(heap.size())
    {
        PII k=heap.top();
        heap.pop();

        int ver=k.second,distance=k.first;

        if(st[ver]) continue;
        st[ver]=true;

        for(int i=h[ver];i!=-1;i=ne[i])
        {
            int j=e[i];

            if(dist[j]>distance+w[i])
            {
                dist[j]=distance+w[i];
                heap.push({dist[j],j});
            }
        }
    }

    for(int i=1;i<=n;i++)
	{
	 	if(dist[i]<0x3f3f3f3f)
	 	cout<<dist[i]<<' ';
	 	else
	 	cout<<2147483647<<' ';
	}
}

int main()
{

    memset(h,-1,sizeof(h));
    memset(dist,0x3f,sizeof(dist));
    // dist[1]=0;

    cin >> n >> m >> s;

    dist[s]=0;
    
    while(m--)
    {
        int x,y,c;
        cin >> x >> y >> c;
        add(x,y,c);
    }

    dijkstra();

    return 0;
}
2023/3/9 09:26
加载中...