/*
** 题目要求过最少k条边的最短路
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn = 5010;
const int maxm = 200010;
const int INF = 1<<31-1;
struct node{
int v,len,next;
}edge[maxm];
int vis[maxn][510],head[maxn],dp[maxn][510];
int n,m,s,t,k,id;
void add_edge(int u,int v,int len){
edge[id].v = v;edge[id].len = len;edge[id].next = head[u];head[u]= id++;
edge[id].v = u;edge[id].len = len;edge[id].next = head[v];head[v]= id++;
} void init(){
int u,v,cost;
memset(head,-1,sizeof(head));
id = 0;
while( m-- ){
scanf("%d%d%d",&u,&v,&cost);
add_edge(u,v,cost);
}
scanf("%d%d%d",&s,&t,&k);
}
struct NODE{
int v,num;
};
int spfa(int s){
int mincost = INF;
//cout << mincost << endl;
memset(dp,-1,sizeof(dp));
memset(vis,0,sizeof(vis));
NODE tmp,now;
queue<NODE>que;
tmp.v = s,tmp.num = 0;
dp[tmp.v][tmp.num] = 0;
vis[tmp.v][tmp.num] = 1;
que.push(tmp);
while( !que.empty()){
now = que.front();
// cout << now.v << " " << now.num << " " << dp[now.v][now.num] << endl;
if(now.v == t && now.num == k && dp[now.v][now.num] < mincost)
mincost = dp[now.v][now.num];
vis[now.v][now.num] = 0;
que.pop();
for(int id = head[now.v]; id != -1; id = edge[id].next){
int v = edge[id].v;
tmp.v = edge[id].v;tmp.num = now.num+10;
if( tmp.num > k)tmp.num = k;
if(dp[tmp.v][tmp.num] == -1 || dp[tmp.v][tmp.num] > dp[now.v][now.num] + edge[id].len){
dp[tmp.v][tmp.num] = dp[now.v][now.num] + edge[id].len;
if( !vis[tmp.v][tmp.num]){
vis[tmp.v][tmp.num] = 1;
que.push(tmp);
}
}
}
} if( mincost == INF)return -1;
return mincost;
}
int main(){
//freopen("in.txt","r",stdin);
while( ~scanf("%d%d",&n,&m)){
init();
printf("%d\n",spfa(s));
}
return 0;
}

  

HDU 4396More lumber is required 过至少K条边的最短路的更多相关文章

  1. POJ 3613 快速幂+Floyd变形(求限制k条路径的最短路)

    题意:       给你一个无向图,然后给了一个起点s和终点e,然后问从s到e的最短路是多少,中途有一个限制,那就是必须走k条边,路径可以反复走. 思路:       感觉很赞的一个题目,据说证明是什 ...

  2. poj 3613 经过k条边最短路 floyd+矩阵快速幂

    http://poj.org/problem?id=3613 s->t上经过k条边的最短路 先把1000范围的点离散化到200中,然后使用最短路可以使用floyd,由于求的是经过k条路的最短路, ...

  3. More lumber is required

    hdu4396:http://acm.hdu.edu.cn/showproblem.php?pid=4396 题意:一个无向带权图,然后给出起点s,终点e,让你求s到e的最短路径,但是这里的路径有要求 ...

  4. POJ 3294 出现在至少K个字符串中的子串

    在掌握POJ 2774(两个串求最长公共子串)以及对Height数组分组后,本题还是容易想出思路的. 首先用字符集外的不同字符连接所有串,这是为了防止两个后缀在比较时超过某个字符串的分界.二分子串的长 ...

  5. POJ 3261 出现至少K次的可重叠最长子串

    题意就是给一列数字,求最长的一个子串,并且满足子串在原数串中出现至少K次,子串可以重叠. 解法是将问题转为判定性问题,二分子串的长度,判定是否满足重复至少K次.判定方法是经典的根据子串长度将Heigh ...

  6. HDU 4862 Jump 任意起点最大权K链不相交覆盖

    你可以从任意起点开始起跳最多K次 每次跳你可以选择往右或者往下跳 从(x1,y1)跳到(x2,y2) 消耗的能量是曼哈顿距离-1 但是如果每次跳的起点和终点格子里的数字是相同的为X的话你会得到X能量 ...

  7. poj2449 (第k条最短路)

    题意:求n个点中,a到b的第k条最短路 思路: 用最短路求出估价函数的h,再在搜索过程中记录g,利用A*求出 最开始想到的便是A*和最短路,但是脑子抽了,居然一个一个去求- -,TL了后才发现可以倒着 ...

  8. K条最短路径算法(KSP, k-shortest pathes):Yen's Algorithm

    参考: K最短路径算法之Yen's Algorithm Yen's algorithm 基于网络流量的SDN最短路径转发应用 K条最短路径算法:Yen's Algorithm 算法背景 K 最短路径问 ...

  9. 分层图 (可以选择K条路的权为0,求最短路)

    分层图可以处理从图中选取k条边使其边权变为0,求最短路 Description 在你的强力援助下,PCY 成功完成了之前的所有任务,他觉得,现在正是出去浪的大好时光.于是,他来到高速公路上,找到一辆摩 ...

随机推荐

  1. http状态码 400-499

    类比 服务器:便利店 客户端:客人 http报文:中文语言+钱 400-499 客户的错误 400 :服务器不理解客服端请求的意思是什么,如请求报文损坏 举例: 客户端:@#!3&* 服务器: ...

  2. 【Android Studio】类名字右下角红色的 J 【待解决】

    问题如下图所示: 正在寻找结解决方法--

  3. 【Python-django后端开发】logging日制配置详解!!!

    官方文档请查看:https://docs.djangoproject.com/en/1.11/topics/logging/ 1. 配置工程日志,在setting.py里,如下 LOGGING = { ...

  4. Broadcast 使用详解

    极力推荐文章:欢迎收藏 Android 干货分享 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以 ...

  5. Discuz论坛 自动加好友留言程序

    目录 [隐藏] 1 思路: 2 代码: 2.1 登录,获取Cookie: 2.2 获取FormHash: 2.3 发送加好友请求并留言: 思路: 一波未平一波又起, 拿到这个需求的时候对我来说还是有挑 ...

  6. 佳木斯集训Day4

    Day4的出题人好毒瘤啊!!! T1我打表过的,正解现在也不会 #include <bits/stdc++.h> #define MAXN 10050 #define ll long lo ...

  7. 算法与数据结构基础 - 回溯(Backtracking)

    回溯基础 先看一个使用回溯方法求集合子集的例子(78. Subsets),以下代码基本说明了回溯使用的基本框架: //78. Subsets class Solution { private: voi ...

  8. 使用executor、callable以及一个Future 计算欧拉数e

    package test; import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMo ...

  9. 逆向破解之160个CrackMe —— 018

    CrackMe —— 018 160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合一共160个待逆向破解的程序 CrackMe:它们都是一些公开给别人尝试破解的小程序,制作 c ...

  10. INSERT: 批量插入结果集方式

    INSERT: 批量插入结果集 insert into table select x,y from A UNION select z,k from B ; insert into table sele ...