这题不能用dij吗?(有关注作为报酬)
查看原帖
这题不能用dij吗?(有关注作为报酬)
377794
Level_1024楼主2022/8/9 10:15

rt,有很多RE

#include<bits/stdc++.h>
using namespace std;
#define int long long
struct Edge{
    int v;
    int w; 
    int next;
}e[50000005];

int vFirst[50000005];
int ind;
void add(int u,int v,int w)
{
    ind++;
    e[ind].v=v;
    e[ind].w=w;
    e[ind].next=vFirst[u];
    vFirst[u]=ind;
 } 
 typedef pair<int,int>pii;

priority_queue < pii, vector <pii>, greater < pii > > q; //构造了一个升序队列,小顶堆,距离-当前码串 
int dis[5000005],s,n,m;
void Dj(int s)
{
    int u,d,v;
    //memset(dis,INF,sizeof(dis));
    dis[s]=0;
    q.push(make_pair(dis[s],s));
    while(!q.empty())
    {
        u=q.top().second;
        d=q.top().first;
        q.pop();
        if(d!=dis[u])
        {
            continue;
        }
        for(int i=vFirst[u];i!=-1;i=e[i].next)
        {
            if(dis[e[i].v]>dis[u]+e[i].w)
            {
                dis[e[i].v]=dis[u]+e[i].w;
                q.push(make_pair(dis[e[i].v],e[i].v));
            }
        }
    }
}
signed main()
{
    cin>>n>>m>>s;
    memset(vFirst,-1,sizeof(vFirst));
    memset(dis,0x3f,sizeof(dis));
    for(int i=1;i<=m;i++)
    {
        int u,v,w;
        cin>>u>>v>>w;
        add(u,v,w);
    }
    Dj(s);
    for(int i=1;i<=n;i++)
    {
        if(dis[i]==0x3f3f3f3f3f3f3f3f)
        {
            cout<<"-1 ";
        }
        else
        {
            cout<<dis[i]<<' ';
        }
        
    }
    return 0;
}

2022/8/9 10:15
加载中...