BOI 2002 双调路径

题目:

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

输入描述

第一行给出有多少个点,多少条边,开始点及结束点.

输出描述

有多少条双调路径

样例输入

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 

分析:

本题用的一种巧妙的做法。显然这题是一道单源最短路问题,用SPFA或是Dijkstra都是可以的。但是我们要进行SPFA的是对于某个固定的花费下的所用的时间。也就是程序当中的dist[city][cost] = time这个在注释里有写。因为费用最大是100,所以cost开到二维数组开出来不会爆内存的!

本题有几个要注意的小问题:(有些是我愚蠢的错误)

  1. 因为是无向边Edge数组记得开2*MAXM
  2. 有的变量名字注意一下哈:time叫t,target也叫t,那不是很愚蠢啊……

程序:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int MAXN = 100 + 1;
 4 const int MAXM = 300 + 1;
 5 int n, m, s, t, EdgeCount = 0, MinTime = 0x3f3f3f3f, Head[MAXN];
 6 int dist[MAXN][MAXN*MAXN];
 7 bool vis[MAXN][MAXN*MAXN];
 8 struct edge
 9 {
10     int Next, Aim, Weight, Time;
11 }Edge[MAXM*2];
12 struct node
13 {
14     int pos, cost;
15 };
16 void insert(int u, int v, int w, int t)
17 {
18     Edge[++EdgeCount] = (edge){Head[u],v,w,t};
19     Head[u] = EdgeCount;
20 }
21 void SPFA()
22 {
23     memset(vis,false, sizeof(vis));
24     memset(dist, 0x3f, sizeof(dist));
25     //dist[city][cost] = time
26     queue<node> Q;
27     Q.push((node){s,0});
28     dist[s][0] = 0;
29     vis[s][0] = true;
30     while (!Q.empty())
31     {
32         node p = Q.front();
33         Q.pop();
34         //vis[p.pos][p.cost] = false;
35         if(p.cost > n*MAXN)
36             continue;
37         for (int i = Head[p.pos]; i; i = Edge[i].Next)
38         {
39             int v = Edge[i].Aim;
40             if(dist[v][p.cost + Edge[i].Weight] > dist[p.pos][p.cost] + Edge[i].Time)
41             {
42                 dist[v][p.cost+Edge[i].Weight] = dist[p.pos][p.cost] + Edge[i].Time;
43                 if(!vis[v][p.cost + Edge[i].Weight])
44                 {
45                     vis[v][p.cost + Edge[i].Weight] = true;
46                     Q.push((node){v,p.cost + Edge[i].Weight});
47                 }
48             }
49         }
50     }
51 }
52 int main()
53 {
54     memset(Head,0,sizeof(Head));
55     cin >> n >> m >> s >> t;
56     for (int i = 1; i <= m; i++)
57     {
58         int u, v, w, t;
59         cin >> u >> v >> w >> t;
60         insert(u,v,w,t);
61         insert(v,u,w,t);
62     }
63     SPFA();
64     int ans = 0;
65     for (int i = 0; i <= MAXN*n; i++)
66     {
67         //cout << dist[t][i] << endl;
68         if ((!(vis[t][i])) || dist[t][i] >= MinTime)
69             continue;
70         MinTime = dist[t][i];
71         ans++;
72     }
73     cout << ans << endl;
74     return 0;
75 }

原文地址:https://www.cnblogs.com/OIerPrime/p/8370761.html

时间: 2024-10-31 17:20:23

BOI 2002 双调路径的相关文章

【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比路径

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

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

双调路径

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

8.2/baltic神(水)题

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

mac 连接mysql提示 Warning: mysqli::real_connect(): (HY000/2002): No such file or directory

mac 连接mysql的时候提示 Warning: mysqli::real_connect(): (HY000/2002): No such file or directory [说明1]MAC下MYSQL的安装路径:/usr/local/mysql-5.5.28-osx10.6-x86 数据库的数据文件在该目录的data文件夹中: 命令文件在bin文件夹中. [说明2]通过终端打开MYSQL命令行的方法:/usr/local/mysql-5.5.28-osx10.6-x86/bin/mysq

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

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

mysql连接报错 ERROR 2002 (HY000): Can&#39;t connect to local MySQL server through socket

安装完mysql连接报错: [[email protected] app]# mysql ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) [[email protected] app]# mysql -uroot -p Enter password:  ERROR 2002 (HY000): Can't connect to local M

hdu-----(1151)Air Raid(最小覆盖路径)

Air Raid Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3378    Accepted Submission(s): 2223 Problem Description Consider a town where all the streets are one-way and each street leads from one

bzoj 2002

2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 3848  Solved: 2051[Submit][Status] Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系数ki,当绵羊达到第i个装置时,它会往后弹ki步,达到第i+ki