您当前的位置: 首页 > 

*DDL_GzmBlog

暂无认证

  • 4浏览

    0关注

    602博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

[luogu] P1629 邮递员送信 反图+两遍最短路

*DDL_GzmBlog 发布时间:2021-11-01 19:48:43 ,浏览量:4

前言

好水。。 ,算是基础题了 传送门 :

思路

因为需要拿了之后又回去,因此我们还需要统计一遍

走回去的最小开销,但是其实没必要都跑一遍

我们只需要建立一个反图即可

CODE
struct node
{
    int to,val;
};
vector g[N],ung[N];
int dist[N],undist[N];

int st[N],unst[N];

void  spfa()
{
    memset(dist,0x3f,sizeof dist);

    dist[1] = 0 ;
    st[1] = 1;



    queue q;
    q.push(1);


    while(!q.empty() )
    {

            int t = q.front();
            q.pop();

            st[t] =false;
            for(auto j:g[t])
            {
                if(dist[j.to] > dist[t] + j.val)
                {
                    dist[j.to] =dist[t] +j.val;
                    if(!st[j.to])
                    {
                        q.push(j.to);
                        st[j.to] = true;
                    }
                }
            }
        

    }
}

void  spfa2()
{

    memset(undist,0x3f,sizeof undist);
    undist[1] = 0;
    unst[1] = 1;

    queue unq;
    unq.push(1);
    
    while(!unq.empty())
    {
        int t =unq.front();
        unq.pop();

        unst[t] =false;

        for(auto j:ung[t])
        {
            if(undist[j.to] > undist[t] + j.val)
            {
                undist[j.to] = undist[t] +j.val;
                if(!unst[j.to])
                {
                    unq.push(j.to);
                    unst[j.to] = true;
                }
            }
        }
    }
}

int n,m,t;


void solve()
{
    cin>>n>>m;
    while(m -- )
    {
        int a,b,w;
        cin>>a>>b>>w;
        g[a].push_back({b,w});
        ung[b].push_back({a,w});
    }
    spfa();
    spfa2();

    ll sum = 0 ;
    
    for(int i=1; i            
关注
打赏
1657350525
查看更多评论
0.0505s