双调路径

https://loj.ac/problem/10083

题目描述

  给出一张图,每条边有两个边权,定义其最小路径为不存在一条路径两种边权都小于它的两种边权,求这张图的最小路径的条数。

思路

  首先这道题有两类边权,我们考虑把一类边权压入dis数组中,即我们用dis[i][j]表示到达i点,花费费用为j时所需要的最少时间。那么假设我们用w1表示i到j的费用,w2表示i到j的时间,那么dis[i][j]=dis[i][j-w1]+w2。这样我们可以直接进行最短路计算,这样已经足以通过这道题。

  不过我们考虑优化,如果存在一个f[j][k]<f[i][j]并且k<j,那么这就肯定不是最优解,不用再更新,而对k的维护,我们可以用树状数组维护f[i][0..j]中的最小值,再进行判断即可。结果我们只要遍历f[n][i],在费用单增情况下时间小即可。

代码

#include <bits/stdc++.h>
using namespace std;
struct aa
{
    int pos,val;
    aa(int pos=0,int val=0):pos(pos),val(val) {}
};
int nxt[660],to[660],w1[660],w2[660],head[330],tot;
int f[330][10005],dis[330][10005],N;
bool exist[330][10005];
void add_edge(int x,int y,int v,int tim)
{
    nxt[++tot]=head[x];
    head[x]=tot;
    to[tot]=y;
    w1[tot]=v;
    w2[tot]=tim;
}
int lowbit(int x)
{
    return x&(-x);
}
void add(int x,int y,int v)
{
    y++;
    for(;y<=N;y+=lowbit(y))f[x][y]=min(f[x][y],v);
}
int query(int x,int y)
{
    y++;
    int ans=0x3f3f3f3f;
    for(;y;y-=lowbit(y))ans=min(ans,f[x][y]);
    return ans;
}
void spfa(int s)
{
    memset(dis,0x3f,sizeof(dis));
    memset(f,0x3f,sizeof(f));
    queue<aa>q;
    q.push(aa(s,0));exist[s][0]=1;
    dis[s][0]=0;
    add(s,0,0);
    while(!q.empty())
    {
        aa u=q.front();q.pop();
        exist[u.pos][u.val]=0;
        for(int i=head[u.pos];~i;i=nxt[i])
        {
            int v=to[i],m=u.val+w1[i];
            if(query(v,m)>dis[u.pos][u.val]+w2[i])
            {
                dis[v][m]=dis[u.pos][u.val]+w2[i];
                add(v,m,dis[v][m]);
                if(!exist[v][m])
                {
                    exist[v][m]=1;
                    q.push(aa(v,m));
                }
            }
        }
    }
}
int main()
{
    int n,m,s,e;
    memset(head,-1,sizeof(head));
    scanf("%d%d%d%d",&n,&m,&s,&e);
    for(int i=1;i<=m;i++)
    {
        int a,b,c,d;
        scanf("%d%d%d%d",&a,&b,&c,&d);
        add_edge(a,b,c,d);add_edge(b,a,c,d);
    }
    N=n*100;
    spfa(s);
    int tim=0x3f3f3f3f,ans=0;
    for(int i=0;i<=N;i++)
        if(dis[e][i]<tim)ans++,tim=dis[e][i];
    printf("%d",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/fangbozhen/p/11707532.html

时间: 2024-11-02 13:40:31

双调路径的相关文章

【BZOJ 1375】 [Baltic2002]Bicriterial routing 双调路径

1375: [Baltic2002]Bicriterial routing 双调路径 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 299  Solved: 115 [Submit][Status] Description 来越多,因此选择最佳路径是很现实的问题.城市的道路是双向的,每条道路有固定的旅行时间以及需要支付的费用.路径由连续的道路组成.总时间是各条道路旅行时间的和,总费用是各条道路所支付费用的总和.同样的出发地和目的地,如果路径A比路径

BOI 2002 双调路径

题目: 城市的道路是双向的,每条道路有固定的旅行时间以及需要支付的费用.路径由连续的道路组成.总时间是各条道路旅行时间的和,总费用是各条道路所支付费用的总和.同样的出发地和目的地,如果路径A比路径B所需时间少且费用低,那么我们说路径A比路径B好.对于某条路径,如果没有其他路径比它好,那么该路径被称为最优双调路径.这样的路径可能不止一条,或者说根本不存在. 给出城市交通网的描述信息,起始点和终点城市,求最优双条路径的条数.城市不超过100个,边数不超过300,每条边上的费用和时间都不超过100.

Bicriterial routing 双调路径 HYSBZ - 1375(分层最短路)

Description 来越多,因此选择最佳路径是很现实的问题.城市的道路是双向的,每条道路有固定的旅行时间以及需要支付的费用.路径由连续的道路组成.总时间是各条道路旅行时间的和,总费用是各条道路所支付费用的总和.同样的出发地和目的地,如果路径A比路径B所需时间少且费用低,那么我们说路径A比路径B好.对于某条路径,如果没有其他路径比它好,那么该路径被称为最优双调路径.这样的路径可能不止一条,或者说根本不存在. 给出城市交通网的描述信息,起始点和终点城市,求最优双条路径的条数.城市不超过100个,

8.2/baltic神(水)题

bzoj1334: Description N个政党要组成一个联合内阁,每个党都有自己的席位数. 现在希望你找出一种方案,你选中的党的席位数要大于总数的一半,并且联合内阁的席位数越多越好. 对于一个联合内阁,如果某个政党退出后,其它党的席位仍大于总数的一半,则这个政党被称为是多余的,这是不允许的. Input 第一行给出有多少个政党.其值小于等于300 下面给出每个政党的席位数.总席位数小于等于 100000 Output 你的组阁方案中最多能占多少个席位. 背包dp.一开始想着贪心贪心...后

【算法学习】双调欧几里得旅行商问题(动态规划)(转)

双调欧几里得旅行商问题是一个经典动态规划问题.<算法导论(第二版)>思考题15-1和北京大学OJ2677都出现了这个题目. 旅行商问题描述:平面上n个点,确定一条连接各点的最短闭合旅程.这个解的一般形式为NP的(在多项式时间内可以求出) J.L. Bentley 建议通过只考虑双调旅程(bitonictour)来简化问题,这种旅程即为从最左点开始,严格地从左到右直至最右点,然后严格地从右到左直至出发点.下图(b)显示了 同样的7个点的最短双调路线.在这种情况下,多项式的算法是可能的.事实上,存

双调巡游

问题 给定平面上n个点作为输入,求出连接所有n个点的最短巡游路线. J.L.Bentley建议将问题简化,限制巡游路线为双调巡游,即从最左边的点开始,严格向右前进,直至最右边的点,然后调头严格向右前进,直至回到起始点. 设计一个O(n^2)时间的最优双调巡游路线算法,可以认为任何两点的x坐标均不同,且所有实数运算都花费单位时间(提示:从左至右扫描,对巡游路线的两个部分分别维护可能的最优解). 将n个点按x坐标从小到大排序,时间复杂度为O(nlogn): 用PATH(i,j)表示从点i严格向左到点

HDU4824 双调欧几里得

Disk Schedule Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 240 Accepted Submission(s): 121 Problem Description 有很多从磁盘读取数据的需求,包括顺序读取.随机读取.为了提高效率,需要人为安排磁盘读取.然而,在现实中,这种做法很复杂.我们考虑一个相对简单的场景. 磁盘有许多轨道

UVA 1347(POJ 2677)Tour(双调欧几里得旅行商问题)

Tour                 Time Limit:3000MS    Memory Limit:0KB    64bit IO Format:%lld & %llu Description John Doe, a skilled pilot, enjoys traveling. While on vacation, he rents a small plane and starts visiting beautiful places. To save money, John mus

POJ 2677 旅行商问题 双调dp或者费用流

Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3408   Accepted: 1513 Description John Doe, a skilled pilot, enjoys traveling. While on vacation, he rents a small plane and starts visiting beautiful places. To save money, John must