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

Description

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

Input

第一行给出有多少个点,多少条边,开始点及结束点. 下面的数据用于描述这个地图

Output

有多少条最优双调路径

Sample Input

4 5 1 4

2 1 2 1

3 4 3 1

2 3 1 2

3 1 1 4

2 4 2 4

Sample Output

2

HINT

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <queue>
#define inf 0x3f3f3f3f
#define maxc (n-1)*100
using namespace std;
struct edge
{
    int y,ne,c,t;
}e[1000];
struct now
{
    int p,c;
};
int tot=0,n,m;
struct data
{
    int t,f;
}d[105][10005];
int s,t,h[105],inq[105][10005];
void Addedge(int x,int y,int co,int ti)
{
    tot++;
    e[tot].y=y;
    e[tot].ne=h[x];
    h[x]=tot;
    e[tot].c=co;
    e[tot].t=ti;
}
void spfa()
{
    for (int i=1;i<=n;i++)
        for (int j=0;j<=maxc;j++)
            d[i][j].f=0,inq[i][j]=0,d[i][j].t=inf;
    queue<now> q;
    now x;
    x.p=s,x.c=0;
    d[s][0].f=1,d[s][0].t=0;
    inq[s][0]=1;
    q.push(x);
    while (!q.empty())
    {
        x=q.front();
        q.pop();
        inq[x.p][x.c]=0;
                for (int i=h[x.p];i;i=e[i].ne)
        {
            int y=e[i].y;
            int co=e[i].c+x.c;
            if (co>maxc) continue;
            if (d[y][co].t>d[x.p][x.c].t+e[i].t)
            {
                d[y][co].t=d[x.p][x.c].t+e[i].t;
                d[y][co].f=1;
                if (!inq[y][co])
                {
                    now aa;
                    aa.p=y,aa.c=co;
                    q.push(aa),inq[y][co]=1;
                }
            }
        }
    }
}
int main()
{
        scanf("%d%d%d%d",&n,&m,&s,&t);
    for (int i=1;i<=m;i++)
    {
        int x,y,ti,co;
        scanf("%d%d%d%d",&x,&y,&co,&ti);
        Addedge(x,y,co,ti);
        Addedge(y,x,co,ti);
    }
    spfa();
    int ans=0,minn=maxc+10;
        for (int i=0;i<=maxc;i++)
    {
        if (!d[t][i].f) continue;
        if (d[t][i].t>=minn) continue;
        minn=d[t][i].t;
        ans++;
    }
    cout<<ans<<endl;
    return 0;
}

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

Sample Output2Hint

原文地址:https://www.cnblogs.com/WTSRUVF/p/9742637.html

时间: 2024-11-02 06:54:09

Bicriterial routing 双调路径 HYSBZ - 1375(分层最短路)的相关文章

【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.

PKU 3613 Cow Relays (指定路径条数的最短路)

题意:N,T,S,E:给你T条边,每条边两端都有编号和权值,问从S走到E允许走N条边,求最短路. foyld加矩阵快速幂思想. 注意要把边离散 #include <iostream> #include <fstream> #include <string.h> #include <algorithm> using namespace std; #define M 303 #define inf 0x3fffffff struct node { int a[M

路网最优路径算法之一分层搜索

1 背景 前面介绍了关于双向及启发式的搜索,它们均可以实现了效率的倍增.但是应用到长距离(例如武汉——杭州大于500公里)的搜索时,平均效率存在100ms级甚至s级的耗时,显然这样一个面对广大用户群的互联网服务引擎效率是不可接受的,那么有没有优化的方向可以实现数量级的提升?      但人类对效率与正确的极致追求也是不止境的.关于双向及启发式搜索,它们的优化初衷均是一致的:缩短搜索范围.有人想到另一个路网搜索优化的方向:稀疏搜索路网密度——分层算法. 2 分层算法 假设有个长距离路径搜索的cas

双调路径

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.这样我们可以直接进行最短路计算,这样已经足以通过这道题. 不过我们

HDU5669 Road 分层最短路+线段树建图

分析:(官方题解) 首先考虑暴力,显然可以直接每次O(n^2) ?的连边,最后跑一次分层图最短路就行了. 然后我们考虑优化一下这个连边的过程 ,因为都是区间上的操作,所以能够很明显的想到利用线段树来维护整个图, 连边时候找到对应区间,把线段树的节点之间连边.这样可以大大缩减边的规模,然后再跑分层图最短路就可以了. 但是这样建图,每一次加边都要在O(logn)个线段树节点上加边,虽然跑的非常快,但是复杂度仍然是不科学的. 为了解决边的规模的问题,开两棵线段树,连边时候可以新建一个中间节点,在对应区

分层最短路-2018南京网赛L

大概题意: 题意:N个点,M条带权有向边,求将K条边权值变为0的情况下,从点1到点N的最短路. 拓展:可以改变K条边的权值为x 做法:把每个点拆成k个点,分别表示还能使用多少次机会,构造新图. 实际写的时候,不用真的拆点,用dist[i][j]表示从源点出发到点i,免费j条边的最小花费,在dijkstra中维护分层即可,每个节点要存价值,编号,已经用的免费条数. 1 #include <iostream> 2 #include <queue> 3 #include <cstd

【分层最短路】Magical Girl Haze

https://nanti.jisuanke.com/t/31001 有K次机会可以让一条边的权值变为0,求最短路. 在存储单源最短路的数组上多开一维状态,d[i][k]表示走到序号i的点,且让k条边权值为0时的最短路. 对于每个待更新的点,尝试不置零此边的状态和置零此边的状态,分别压入优先队列去更新其他状态. 另外,此题由于有重边,需要先去重,保留同起始点最短的边. 代码: #include <iostream> #include <algorithm> #include <

ACM-ICPC 2018 南京赛区网络预赛 L题(分层最短路)

题目链接:https://nanti.jisuanke.com/t/31001 题目大意:给出一个含有n个点m条边的带权有向图,求1号顶点到n号顶点的最短路,可以使<=k条任意边的权值变为0. 样例输入 复制 1 5 6 1 1 2 2 1 3 4 2 4 3 3 4 1 3 5 6 4 5 2 样例输出 复制 3 解题思路:可以用两种做法,不过都差不多,应该算是同一种思路的不同写法.第一种是在建图时,将一个点拆成k个层次的点,应该总共有k+1层,每个相同层次的点按输入的边权连接,每个点可以向它