【xsy2304】哈 最短路
题目大意:有一个$n$个点,$m$条有向边的图,有$q$组询问。
每次询问:从$a$到$b$,经过不超过$c$条边,且依次经过的边边权递增,问最短路为多少,无解输出-1。
数据范围:$n≤150$,$m≤5000$,$q≤1000$
我场上并没有去想正解,打了个spfa居然获得$90pts$好成绩。
首先对于经过不超过$c$条边,当$c>n-1$时,是没有意义的(显然经过边数不会超过$n-1$),这种情况下我们直接将$c$赋值为$n-1$即可。
我们设$dis[i][j]$表示从$a$出发,经过不超过j条边后到达i的最短距离。
答案显然为$\min\limits_{i=1}^{c}dis[b][i]$。
考虑如何满足要求的边权递增:我们显然只需要把这些边从小到大排个序,然后从小到大拿出,丢去增广即可。
单次查询的复杂度显然是$O(mc)$的,上限显然是$O(nm)$。
那么,总时间复杂度为$O(m\log\ m+qnm)$。
#include<bits/stdc++.h>
#define N 155
#define M 5005
#define INF 16843009
using namespace std; struct edge{
int u,v,w;
void rd(){scanf("%d%d%d",&u,&v,&w);}
friend bool operator <(edge a,edge b){return a.w<b.w;}
}a[M];
int n,m,Q; int dis[N][N]={};
void spfa(int A,int b,int c){
memset(dis,,sizeof(dis));
dis[A][]=;
c=min(c,n);
for(int i=;i<=m;i++){
for(int j=;j<=c;j++)
dis[a[i].v][j]=min(dis[a[i].v][j],dis[a[i].u][j-]+a[i].w);
}
int minn=INF;
for(int i=;i<=c;i++) minn=min(minn,dis[b][i]);
if(minn==INF) minn=-;
printf("%d\n",minn);
} int main(){
scanf("%d%d%d",&n,&m,&Q);
for(int i=;i<=m;i++) a[i].rd();
sort(a+,a+m+);
while(Q){
int a,b,c; scanf("%d%d%d",&a,&b,&c);
spfa(a,b,c);
Q--;
}
}
【xsy2304】哈 最短路的更多相关文章
- bzoj1001--最大流转最短路
http://www.lydsy.com/JudgeOnline/problem.php?id=1001 思路:这应该算是经典的最大流求最小割吧.不过题目中n,m<=1000,用最大流会TLE, ...
- 【USACO 3.2】Sweet Butter(最短路)
题意 一个联通图里给定若干个点,求他们到某点距离之和的最小值. 题解 枚举到的某点,然后优先队列优化的dijkstra求最短路,把给定的点到其的最短路加起来,更新最小值.复杂度是\(O(NElogE) ...
- Sicily 1031: Campus (最短路)
这是一道典型的最短路问题,直接用Dijkstra算法便可求解,主要是需要考虑输入的点是不是在已给出的地图中,具体看代码 #include<bits/stdc++.h> #define MA ...
- 最短路(Floyd)
关于最短的先记下了 Floyd算法: 1.比较精简准确的关于Floyd思想的表达:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个节点X到B.所以,我们假设maz ...
- bzoj1266最短路+最小割
本来写了spfa wa了 看到网上有人写Floyd过了 表示不开心 ̄へ ̄ 改成Floyd试试... 还是wa ヾ(。`Д´。)原来是建图错了(样例怎么过的) 结果T了 于是把Floyd改回spfa 还 ...
- HDU2433 BFS最短路
Travel Time Limit: 10000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- 最短路(代码来源于kuangbin和百度)
最短路 最短路有多种算法,常见的有一下几种:Dijstra.Floyd.Bellman-Ford,其中Dijstra和Bellman-Ford还有优化:Dijstra可以用优先队列(或者堆)优化,Be ...
- Javascript优化细节:短路表达式
什么是短路表达式? 短路表达式:作为"&&"和"||"操作符的操作数表达式,这些表达式在进行求值时,只要最终的结果已经可以确定是真或假,求值过程 ...
- Python中三目计算符的正确用法及短路逻辑
今天在看别人代码时看到这样一种写法, 感觉是个挺容易踩到的坑, 搞清楚后写出来备忘. 短路逻辑 Python中进行逻辑运算的时候, 默认采用的是一种叫做短路逻辑的运算规则. 名字是很形象的, 下面直接 ...
随机推荐
- hikari链接池
# 链接池 hikari: # 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 缺省:30秒 connection-timeout: 60000 # ...
- SpringMVC 重定向和请求转发(转载)
本文系转载,原文地址:https://blog.csdn.net/m0_37450089/article/details/78703366 servlet的请求转发(forward)和重定向(se ...
- gitlab 常用维护命令
GitLab简介 GitLab 是一个用于仓库管理系统的开源项目.使用Git作为代码管理工具,并在此基础上搭建起来的web服务.Github是公共的git仓库,而Gitlab适合于搭建企业内部私有gi ...
- day37 异步回调和协程
异步回调 """ 异步任务使用场景 爬虫 1.从目标站点下载网页数据 本质就是HTML格式字符串 2.用re从字符串中提取出你需要的数据 ""&quo ...
- python + Jquery,抓取西东网上的Java教程资源网址
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2018-06-15 14:01:45 # @Author : Chenjun (320 ...
- hdpi对应分辨率
ldpi QVGA (240×320) mdpi HVGA (320×480) hdpi WVGA (480×800),FWVGA (480×854) xhdpi 720P(1280*720) ...
- OS history
UNIX的诞生 1965年时,贝尔实验室(Bell Labs)加入一项由奇异电子(General Electric)和麻省理工学院(MIT)合作的计划:该计划要建立一套多使用者.多任务.多层次(m ...
- 使用git开发的流程
1.git常用的主干,分支命令 查看分支 git branch 或者 git branch -v A) 创建分支 git branch Dev_samples_V1.0.0 B) 切换分支 git c ...
- Eigen使用矩阵作为函数参数
1 使用矩阵作为函数参数介绍 文章来源Writing Functions Taking %Eigen Types as Parameters Eigen为了在函数中传递不同的类型使用了表达式模板技术. ...
- if else if else 语句
适合在程序中,实现多条件的判断 编写格式: if(条件){ if 执行体 }else if(条件){ if 执行体 }else if(条件){ if 执行体 }else{ else的执行体 } 当if ...