dij16分,过#2,用pair

P4779 【模板】单源最短路径(标准版)

zkhehe @ 2024-10-06 14:41:46

dijkstra,用邻接表存的,用的pair,邻接表是pair<v,w>,堆是pair<w,u>,不会写operator。

#include <queue>
#include <vector>
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,m,s;
int ans[N];
priority_queue<pair<int,int >,vector<pair<int,int> >,greater<pair<int,int> > >pq;//w,u
vector<pair<int,int> >vc[N];//v,w
int main(){
    cin>>n>>m>>s;
    for(int i=1;i<=m;i++){
        int u,v,w;
        scanf("%d%d%d",&u,&v,&w);
        vc[u].push_back(make_pair(v,w));
    }
    pq.push(make_pair(0,s));

    for(int i=1;i<=n;i++){
        int u=pq.top().second;
        int w=pq.top().first;
        if(ans[u]>0)continue;
        ans[u]=w;
        pq.pop();
        for(pair<int,int>p:vc[u]){
            int v=p.first;
            if(ans[v]||v==s)continue;
            int vw=p.second;
            pq.push(make_pair(w+vw,v));
        }
    }
    for(int i=1;i<=n;i++){
        printf("%d ",ans[i]);
    }
    return 0;
}

by masonxiong @ 2024-10-06 14:43:02

@zkhehe

构造出一组卡掉你的数据:

4 7 1
1 2 1
2 1 1
1 3 1
3 1 1
2 3 1
3 2 1
3 4 100

正确答案应该是 0 1 1 101

然而您输出 0 1 2 0


by zkhehe @ 2024-10-06 14:47:16

@masonxiong 感谢数据


by zkhehe @ 2024-10-06 14:50:24

@masonxiong 感谢dalao,过了。没用三角不等式

#include <queue>
#include <vector>
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,m,s;
int ans[N];
priority_queue<pair<int,int >,vector<pair<int,int> >,greater<pair<int,int> > >pq;//w,u
vector<pair<int,int> >vc[N];//v,w
int main(){
    cin>>n>>m>>s;
    for(int i=1;i<=m;i++){
        int u,v,w;
        scanf("%d%d%d",&u,&v,&w);
        vc[u].push_back(make_pair(v,w));
    }
    pq.push(make_pair(0,s));

    while(!pq.empty()){
        int u=pq.top().second;
        int w=pq.top().first;
        pq.pop();
        if(ans[u]>0)continue;
        ans[u]=w;
        for(pair<int,int>p:vc[u]){
            int v=p.first;
            if(ans[v]||v==s)continue;
            int vw=p.second;
            pq.push(make_pair(w+vw,v));
        }
    }
    for(int i=1;i<=n;i++){
        printf("%d ",ans[i]);
    }
    return 0;
}

by zkhehe @ 2024-10-06 14:51:04

@masonxiong 再次感谢数据


|