[POI 2004]ZAW
Description
在 Byte 山的山脚下有一个洞穴入口. 这个洞穴由复杂的洞室经过隧道连接构成. 洞穴的入口是 1 号点.两个洞室要么就通过隧道连接起来,要么就经过若干隧道间接的相连. 现在决定组织办一个'King's of Byteotia Cup' 比赛. 参赛者的目标就是任意选择一条路径进入洞穴并尽快出来即可. 一条路径必须经过除了 1 之外还至少要经过其他一个洞室.一条路径中一个洞不能重复经过(除了 1 以外),类似的一条隧道也不能重复经过.
一个著名的洞穴探险家 Byteala 正准备参加这个比赛. Byteala 已经训练了数月而且他已获得了洞穴系统的一套详细资料. 对于每条隧道他都详细计算了从两个方向经过所需要的时间. 经过一个洞室的时间很短可以忽略不记. 现在Byteala 向计算一条符合条件的最优路径.
Input
第一行有两个数 n 和 m (3 <= n <= 5000, 3 <= m <= 10000) 分别表示洞室的数目以及连接他们的隧道的数目. 洞室从 1 到 n 编号. “前面洞室”的编号为 1.
接下来 m 行描述了所有的隧道. 每行四个整数 a,b,c,d 表示从洞室 a 到洞室 b 需要 c分钟的时间,而从洞室 b到洞室 a需要 d分钟的时间, 1 <= a,b <= n, a <> b, 1 <= c,d <= 10000. 你可以假设符合要求的路径肯定存在.
Output
输出一行,最少需要多少时间完成比赛.
Sample Input
3 3
1 2 4 3
2 3 4 2
1 3 1 1
Sample Output
6
HINT
经过 1, 2, 3, 1
题解
要求一个最短路,担心的就是一条边被正反经过两次。
规定第一步为$1$到$i$,并把这条边设为不可经过。然后从$i$做最短路到$1$,因为这个过程是不会经历重边的(如果经历了就不是最短路了)。
数据有点坑:不要标记数组还快一点...
数据有点卡$SPFA$:如果松弛节点时算出的$dist$比之前算出的最优$ans$还大,显然不用拓展了。
#include<map>
#include<cmath>
#include<ctime>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<string>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define LL long long
#define Max(a,b) ((a)>(b) ? (a):(b))
#define Min(a,b) ((a)<(b) ? (a):(b))
using namespace std;
const int N=;
const int M=;
const int lenth=;
const int INF=~0u>>; int n,m,u,v,c;
struct tt
{
int to,next,cost;
}edge[M*+];
int path[N+],top=-;
void Add(int u,int v,int c);
int ans=INF;
int tmp,tmp2; int dist[N+];
void SPFA(int u); int main()
{
freopen("zaw.in","r",stdin);
freopen("zaw.out","w",stdout);
memset(path,-,sizeof(path));
scanf("%d%d",&n,&m);
for (int i=;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&c);
Add(u,v,c);
scanf("%d",&c);
Add(v,u,c);
}
for (int i=path[];i!=-;i=edge[i].next)
{
tmp=edge[i].cost;
tmp2=edge[i^].cost;
edge[i].cost=edge[i^].cost=INF-1e9;
SPFA(edge[i].to);
ans=Min(ans,tmp+dist[]);
edge[i].cost=tmp;
edge[i^].cost=tmp2;
}
printf("%d\n",ans);
return ;
} void Add(int u,int v,int c)
{
edge[++top].to=v;
edge[top].cost=c;
edge[top].next=path[u];
path[u]=top;
}
void SPFA(int u)
{
memset(dist,/,sizeof(dist));
dist[u]=;
int Q[lenth+],head=,tail=;
Q[head]=u;
while (head!=tail)
{
int u=Q[head++];
head%=lenth;
for (int i=path[u];i!=-;i=edge[i].next)
{
if (dist[edge[i].to]>dist[u]+edge[i].cost&&ans>tmp+dist[u]+edge[i].cost)
{
dist[edge[i].to]=dist[u]+edge[i].cost;
Q[tail++]=edge[i].to;
tail%=lenth;
}
}
}
}
[POI 2004]ZAW的更多相关文章
- bzoj 2069 [ POI 2004 ] ZAW —— 多起点最短路 + 二进制划分
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2069 首先,对于和 1 相连的点,一定是从某个点出发,回到另一个点: 所以需要枚举起点和终点 ...
- [POI 2004]SZP
Description Byteotian 中央情报局 (BIA) 雇佣了许多特工. 他们每个人的工作就是监视另一名特工.Byteasar 国王需要进行一次秘密行动,所以他要挑选尽量多的信得过的特工. ...
- 解题:POI 2004 String
题面 首先我们要有一个明确的构造思路 对于非根节点,我们把子树连上来的线两两配对,这样如果它有奇数个子树就会剩一个,这时候把这根线传给父亲即可.对于根节点还是两两配对,但是注意如果它也有奇数个子树就不 ...
- 解题:POI 2004 Bridge
题面 小学数奥见祖宗(相信大多数人小学都看过这个玩意 如果你没看过这个问题,第一反应可能是让跑的最快的来回送火把,然而样例已经hack掉了这种做法,更优的做法是让跑的最快的和第二快的来回送火把.然后事 ...
- bzoj 2067 [ Poi 2004 ] SZN —— 二分
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2067 问题1:贪心考虑,应该是每个点的儿子尽量两两配对,如果剩一个就和自己合并向上,所以 a ...
- SPOJ16607 IE1 - Sweets
题面 传送门: 洛咕 SPOJ Solution 这题的想法挺妙的. . 首先,对于这种区间求答案的问题,我们一般都可以通过类似前缀和的思想一减来消去a,即求[a,b]的答案可以转化为求[1,b]-[ ...
- POI ZAW
要求一个最短路,担心的就是一条边被正反经过两次. 规定第一步为1到i,并把这条边设为不可经过.然后从i做最短路到1,因为这个过程是不会经历重边的(如果经历了就不是最短路了). 求最短路用SPFA,但常 ...
- java使用poi将html导出word,默认打开页面视图
<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:o ...
- 利用poi导出Excel
import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.r ...
随机推荐
- JavaScript(第三十三天)【总结:封装基础前端框架】
源码地址:https://github.com/whisper540/Base
- Go语言的数组
在 Go 语言里,数组是一个长度固定的数据类型,用于存储一段具有相同的类型的元素的连续块.数组存储的类型可以是内置类型,如整型或者字符串,也可以是某种结构类型. 1 数组特性 (1)内存是连续分配,C ...
- 利用1.1.1.1进行DNS网络加速,仅需2分钟让网络更快
NEWS 近日,Cloudflare 和 APNIC联合推出了1.1.1.1DNS网络加速. Cloudflare 运行全球规模最大.速度最快的网络之一.APNIC 是一个非营利组织,管理着亚太和大洋 ...
- Beta Scrum Day 2
听说
- Linux学习--线程控制
关于线程控制,主要就是几个模块,我们一个一个消灭.消化: 一.线程创建: 1.先来看看在Linux环境下的线程创建函数: 分析:意思很明显: 1.函数名是 pthread_create : 2.功能 ...
- splinter web测试框架
1.安装谷歌浏览器驱动(windows把驱动解压放在Python.exe同级目录即可) http://chromedriver.storage.googleapis.com/index.html 注意 ...
- hashlib 加密
import hashlib def md5(args): hash = hashlib.md5(bytes('aaadf',encoding='utf-8')) hash.update(bytes( ...
- 自主学习之RxSwift(一) -----Driver
对于RxSwift,我也是初学者,此系列来记录我学习RxSwift的历程! (一) 想必关于Drive大家一定在RxSwift的Demo中看到过,也一定有些不解,抱着一起学习的态度,来了解一下Driv ...
- Unix下zfs文件系统重组RAID-5后可以这样恢复
存储做的RAID-5, SCSI硬盘,操作系统是FreeBSD,文件系统是zfs.本案例共有12块硬盘,11块硬盘里有数据,1块硬盘是热备盘.其中第6块数据硬盘出现故障,重组时需要将其剔除. 物理盘: ...
- JAVA_SE基础——69.Date类
package cn.itcast.other; import java.text.ParseException; import java.text.SimpleDateFormat; import ...