http://acm.uestc.edu.cn/#/problem/show/915

方老师的分身 II

Time Limit: 10000/5000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
Submit Status

方老师计算出了走路时间最长的那个分身所用的时间。于是有个特殊的分身(据说是方老师真身!)就不想如此古板的走最短路了!由于这个分身的特殊性,这个分身对于单向边可以当双向边走。但是这个特殊的分身想走最短路的同时,要求至少经过k条边。

Input

有多组数据

第一行两个整数n,m(1≤n≤5000,1≤m≤100000)表示有n个教室,m条边。

接下来m行,每行3个数,u,v,t。表示u,v间有一条长度为t的边。

最后一行三个整数s,t,k,表示起点、终点、至少经过k(k≤50)条边。

Output

一个整数,表示最短路径长度。如果无解输出−1。

每组数据占一行。

Sample input and output

Sample Input Sample Output
4 4
1 2 1
2 3 2
1 3 100
3 4 1
1 3 5
7

题解:在基础的最短路上加了限制条件:不小于k的长度。于是可以在距离数组dis上加一维状态,dis[i][j]表示到达节点i已经过j条边的最短路,达到目的。这里采用的是spfa,dijkstra也可。

这里简单说下spfa的算法:

•就搞一个队列。一开始把起点压进去。每次弹出一个点,把和这个点有边直接相连的点都更新一遍,如果当前算出的距离小于之前算出的距离,就把值改成当前算的,然后看这个新点,如果不在队列中就压入队列。
•当队列为空时,就可以得到所有点到起点的距离。
代码:

 #include <fstream>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue> using namespace std; const int INF=0x7fffffff;
const int N=;
const int M=;
const int K=;
queue<pair<int,int> > q;
int n,m,s,t,k;//s->begin; t->end.
int head[N],later[M],u[M],v[M],w[M];
int dis[N][K];//到达第i个节点已经过k条边,此时的最短距离
bool b[N][K]; void spfa(); int main()
{
//freopen("D:\\input.in","r",stdin);
//freopen("D:\\output.out","w",stdout);
while(~scanf("%d%d",&n,&m)){
memset(head,-,sizeof(head));
for(int i=;i<m;i++){
scanf("%d%d%d",&u[i],&v[i],&w[i]);
later[i]=head[u[i]];
head[u[i]]=i;
u[i+m]=v[i];
v[i+m]=u[i];
w[i+m]=w[i];
later[i+m]=head[u[i+m]];
head[u[i+m]]=i+m;
}
scanf("%d%d%d",&s,&t,&k);
spfa();
if(dis[t][k]==INF) puts("-1");
else printf("%d\n",dis[t][k]);
}
return ;
}
void spfa(){
for(int i=;i<=n;i++)
for(int j=;j<=K;j++)
dis[i][j]=INF;
dis[s][]=;
q.push(make_pair(s,));
while(!q.empty()){
pair<int,int> tmp=q.front();
q.pop();
b[tmp.first][tmp.second]=;
for(int i=head[tmp.first];i!=-;i=later[i]){
int tt=min(tmp.second+,k);//边数大于k的都当做k来处理
if(dis[v[i]][tt]>dis[tmp.first][tmp.second]+w[i]){
dis[v[i]][tt]=dis[tmp.first][tmp.second]+w[i];
if(!b[v[i]][tt])//避免重复入队
q.push(make_pair(v[i],tt)),b[v[i]][tt]=;
}
}
}
}

cdoj915-方老师的分身 II (长度不小于k的最短路)【spfa】的更多相关文章

  1. UESTC_方老师的分身 II CDOJ 915

    方老师的分身 II Time Limit: 10000/5000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  2. UESTC 915 方老师的分身II --最短路变形

    即求从起点到终点至少走K条路的最短路径. 用两个变量来维护一个点的dis,u和e,u为当前点的编号,e为已经走过多少条边,w[u][e]表示到当前点,走过e条边的最短路径长度,因为是至少K条边,所以大 ...

  3. 【POJ 3415】Common Substrings 长度不小于k的公共子串的个数

    长度不小于k的公共子串的个数,论文里有题解,卡了一上午,因为sum没开long long!!! 没开long long毁一生again--- 以后应该早看POJ里的Discuss啊QAQ #inclu ...

  4. POJ-Common Substrings(后缀数组-长度不小于 k 的公共子串的个数)

    题意: 长度不小于 k 的公共子串的个数 分析: 基本思路是计算 A 的所有后缀和 B 的所有后缀之间的最长公共前缀的长度,把最长公共前缀长度不小于 k 的部分全部加起来. 先将两个字符串连起来,中间 ...

  5. POJ 3415 Common Substrings(长度不小于K的公共子串的个数+后缀数组+height数组分组思想+单调栈)

    http://poj.org/problem?id=3415 题意:求长度不小于K的公共子串的个数. 思路:好题!!!拉丁字母让我Wa了好久!!单调栈又让我理解了好久!!太弱啊!! 最简单的就是暴力枚 ...

  6. POJ 3415 Common Substrings 【长度不小于 K 的公共子串的个数】

    传送门:http://poj.org/problem?id=3415 题意:给定两个串,求长度不小于 k 的公共子串的个数 解题思路: 常用技巧,通过在中间添加特殊标记符连接两个串,把两个串的问题转换 ...

  7. Common Substrings POJ - 3415(长度不小于k的公共子串的个数)

    题意: 给定两个字符串A 和 B, 求长度不小于 k 的公共子串的个数(可以相同) 分两部分求和sa[i-1] > len1  sa[i] < len1  和  sa[i-1] < ...

  8. poj 3415 后缀数组 两个字符串中长度不小于 k 的公共子串的个数

    Common Substrings Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 11469   Accepted: 379 ...

  9. POJ - 3415 Common Substrings(后缀数组求长度不小于 k 的公共子串的个数+单调栈优化)

    Description A substring of a string T is defined as: T( i, k)= TiTi+1... Ti+k-1, 1≤ i≤ i+k-1≤| T|. G ...

随机推荐

  1. keycloak 了解

    Keycloak 是一个针对Web应用和 RESTful Web 服务提供 SSO 集成.基于 OAuth 2.0 和 JSON Web Token(JWT) 规范.目前用于实现 JBoss 与 Wi ...

  2. minio 安装以及使用

    1. 为了方便使用 docker 安装 docker run -p 9000:9000 minio/minio server /export   注意启动显示的 appkey secretkey  C ...

  3. consul dns 转发配置

    测试使用dnsmasq.  优势:可以方便的进行应该编码,进行动态域名解析,容错处理.   因为consul 默认的dns 为127.0.0.1 8600  所以配置如下:  文件目录: /etc/d ...

  4. (转)完美解决 Android WebView 文本框获取焦点后自动放大有关问题

    完美解决 Android WebView 文本框获取焦点后自动放大问题 前几天在写一个项目时,要求在项目中嵌入一个WebView 本来很快就完成了,测试也没有问题.但发给新加坡时,他们测试都会出现文本 ...

  5. Linux 内核源码目录结构

    arch:包含和硬件体系结构相关的代码,每种平台占用一个相应的目录. block:块设备驱动程序 I/O 调度. crypto:常用加密和散列算法(如AES.SHA等),还有一些压缩和CRC校验算法. ...

  6. linux误删数据恢复

    linux下数据恢复工具有: 1.通过分析文件系统的日志,解析文件的inode,可以恢复ex3 ex4的文件系统下的数据 extundelete:扫描inode和恢复数据同时进行,因此恢复速度很快.支 ...

  7. 老齐python-基础9(函数)

    继续上篇 函数 多参数: >>> def foo(x,y,z,*args,**kargs): ... print(x) ... print(y) ... print(z) ... p ...

  8. EMguCV搭建第一个程序

    这篇博客旨在教学Emgucv3.0的安装与配置. 环境:vs2013+Emgucv3.0 Emgu Cv简介: Emgu CV 是.NET平台下对OpenCV图像处理库的封装.也就是opencv的.N ...

  9. idea maven 打包 引用本地jar

    1将本地jar包导入到mvn本地库 mvn install:install-file -Dfile=/Users/liuqiang/Documents/gmpl/gmpl-server/lib/ali ...

  10. SpringMVC之八:基于SpringMVC拦截器和注解实现controller中访问权限控制

    SpringMVC的拦截器HandlerInterceptorAdapter对应提供了三个preHandle,postHandle,afterCompletion方法. preHandle在业务处理器 ...