HDU 6071 Lazy Running

本文介绍了一种使用最短路径算法解决特定路径长度逼近问题的方法。问题设定为在一个由四个点组成的简单图中,寻找从点2出发并返回点2的路径,该路径长度最接近给定值k。通过分析与点2相连的最短边,并利用最短路算法维护路径长度,实现了对最接近k的路径长度的有效计算。
摘要由CSDN通过智能技术生成

题目:http://acm.hdu.edu.cn/showproblem.php?pid=6071

题意:给你4个点,1-2,2-3,3-4,4-1之间有边相连

求从2点出发,回到2点时最接近k的路径长度

 

取与2相连的最短边w

如果存在一条回到2的路径长度为x,那么一定存在一条长度为x+2w的路径,往返一次就行了

用d[i][j]表示,到达i 时,mod 2*w 为j 时的最短路径

用最短路算法维护这个数组即可

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
typedef long long ll;
typedef pair<ll,int> pa;
const ll INF=0x3f3f3f3f3f3f3f3f;
int tot;
int mod;
int to[N],nt[N],val[N],head[N];
ll d[5][N];
void add(int u,int v,int w)
{
    nt[++tot]=head[u];
    to[tot]=v;
    val[tot]=w;
    head[u]=tot;
}
void dij(int x)
{
    for(int i=1;i<=4;i++)
        for(int j=0;j<mod;j++)
            d[i][j]=INF;
    priority_queue<pa,vector<pa>,greater<pa> > que;
    que.push(make_pair(0,x));
    while(!que.empty())
    {
        pa t=que.top();que.pop();
        ll x=t.first;
        int y=t.second;
        if (x>d[y][x%mod]) continue;
        for(int i=head[y];i!=-1;i=nt[i])
        {
            ll tem=x+val[i];
            if (d[to[i]][tem%mod]>tem)
            {
                d[to[i]][tem%mod]=tem;
                que.push(make_pair(tem,to[i]));
            }
        }
    }
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        ll k;
        int d1,d2,d3,d4;
        scanf("%lld%d%d%d%d",&k,&d1,&d2,&d3,&d4);
        if (d1>d2) mod=2*d2;else mod=2*d1;
        tot=0;
        memset(head,-1,sizeof(head));
        add(1,2,d1);add(2,1,d1);
        add(2,3,d2);add(3,2,d2);
        add(3,4,d3);add(4,3,d3);
        add(4,1,d4);add(1,4,d4);
        dij(2);
        ll ans=INF;
        for(int i=0;i<mod;i++)
        {
            if (d[2][i]>=k) ans=min(ans,d[2][i]);
            else ans=min(ans,d[2][i]+(k-d[2][i]+mod-1)/mod*mod);
        }
        printf("%lld\n",ans);
    }
    return 0;
}

  

转载于:https://www.cnblogs.com/bk-201/p/8873267.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值