hud1548 a strange lift  最短路/bfs  题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1548

题意:一个奇怪的电梯,每层楼的按键 只能上达 i + k[i] 层,下至 i- k[i] 层。不能到达超过n楼, 也不能小于 1楼。问最少按键数。以单个0结束输入。

思路:bfs, 从起点出发,每个楼层只会访问一次,在不出界的情况下访问能够到达的楼层。

总结:布吉岛神马原因,只有用G++交才过,导致我纠结了好多天,【摔】!

AC代码:

 //AC
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<limits.h>
using namespace std;
#define maxn 2000
#define INF INT_MAX
int n, a, b;
int arr[maxn];
bool inq[maxn];
int dis[maxn]; void bfs(int st){
queue<int> q;
q.push(st);
int x;
dis[st] = ;
if(a < ||a > n||b < ||b > n) return;
while(!q.empty()){
x = q.front();
q.pop();
if(x < ||x > n||x == b) break;
if(x+arr[x] >= &&x+arr[x] <= n&&!inq[x+arr[x]]) { q.push(x+arr[x]); inq[x+arr[x]] = ; dis[x+arr[x]] = dis[x] + ; }
if(x-arr[x] >= &&x-arr[x] <= n&&!inq[x-arr[x]]) { q.push(x-arr[x]); inq[x-arr[x]] = ; dis[x-arr[x]] = dis[x] + ; }
//if(x+arr[x]>n&&x-arr[x]<1) break;
}
}
int main(){
while(~scanf("%d",&n) ,n){
scanf("%d%d", &a, &b);
for(int i = ; i <= n; i++)
scanf("%d",&arr[i]);
memset(inq, , sizeof(inq));
for(int i = ; i <= maxn; i++){
dis[i] = INF;
}
bfs(a);
printf("%d\n", (dis[b] == INF)?-:dis[b]);
}
}

hdu2544    最短路题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544

题意:正如题目所说,是最短路,可以说是单源最短路入门题。

思路:可以用dijkstra做,这里我用spfa,不知道写的规不规范,总之思路和bellman-ford很像的,相当于Bellman-Ford的队列优化,也相当于做一趟bfs,具体是从当前节点出发,访问所有节点,如果能够到达,且被访问节点到起点的值比当前节点到起点的值加上当前节点到该节点大,则更新被访问的节点到起点的值,如果节点不在队列中,则入队,复杂度最坏是O(mn)。

总结:写完交wa了N+1次,最后才发现是INF的值没设好,Σ(っ °Д °;)っ设小了可能比更新后的距离小了,设大了,比如INT_MAX又溢出了。。。所以后来设成 节点数X单条路径最大距离  再大一点点就过了~~T^T

AC代码如下:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<limits.h>
#include<queue>
using namespace std;
#define maxn 109
#define INF 1000011
int n, m, w[maxn][maxn];
void spfa()
{
int d[maxn], k;
bool inq[maxn];
for(int i = ; i <= n; i++) {d[i] = INF; inq[i] = false;}
d[] = ;
//inq[1] = true;
queue<int> q;
q.push();
while(!q.empty()){
k = q.front(); q.pop();
inq[k] = false;
for(int j = ; j <= n; j++){
int t = d[k] + w[k][j];
if(d[j] > t){
d[j] = t;
if(!inq[j]){
q.push(j);
inq[j] = true;
}
}
}
}
printf("%d\n",d[n]);
} int main()
{
while(scanf("%d%d", &n, &m)&&n&&m){
for(int i = ; i <= n; i++)
for(int j = ; j <= n; j++)
w[i][j] = (i == j)?:INF; for(int i = ; i < m; i++){
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
w[a][b] = w[b][a] =c;
}
spfa();
}
return ;
}

hdu 3790 最短路径问题 基础最短路

思路:基础最短路,先考虑路径再考虑费用

总结:WA原因, 输入时没考虑 a, b 之间存在多条路径

AC代码:

spfa版

 //spfa版

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<limits.h>
#include<queue>
using namespace std;
#define maxn 2000
#define INF INT_MAX-100001
int n, m, a, b, d, p, s, t;
int w[maxn][maxn], cost[maxn][maxn];
struct node{
int dis, cos;
}; void test(node* x){
for(int i = ; i <= n; i++)
{
cout<<x[i].dis<<" "<<x[i].cos<<endl;
}
} void spfa(int s, int t)
{
node d[maxn]; bool inq[maxn]; memset(inq, , sizeof(inq));
int k;
for(int i = ; i < maxn; i++)
d[i].dis = d[i].cos = INF; d[s].dis = d[s].cos = ; inq[s] = true;
queue<int> q;
q.push(s);
while(!q.empty()){
k = q.front(); q.pop();
inq[k] = false;
for(int i = ; i <= n; i++){
if(i != k){
int t1 = d[k].dis + w[k][i]; int t2 = d[k].cos + cost[k][i];
if(t1 < d[i].dis){
d[i].dis = t1;
d[i].cos = t2;
if(!inq[i]) { q.push(i); inq[i] = true; }
}
if(t1 == d[i].dis&&t1 != INF){
if(t2 < d[i].cos) {
d[i].cos = t2;
}
if(!inq[i]){ q.push(i); inq[i] = true; }
}
}
}
}
//test(d);
printf("%d %d\n", d[t].dis, d[t].cos); }
void init()
{
for(int i = ; i <= n; i++)
for(int j = ; j <= n; j++){
w[i][j] = cost[i][j] = (i == j)?:INF;
}
}
int main()
{
while(scanf("%d%d", &n, &m),n,m){
init();
for(int i = ; i < m; i++){
scanf("%d%d%d%d", &a, &b, &d, &p);
if(d < w[a][b]){
w[a][b] = w[b][a] = d;
cost[a][b] = cost[b][a] = p;
}
}
scanf("%d%d", &s, &t); spfa(s, t);
}
return ;
}

dijkstra版

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<string>
#include<cmath>
#define maxn 1024
#define INF 0x3fffffff
using namespace std;
int n, m;
int d[maxn];
struct node{
int dis, cos;
};
node arr[maxn][maxn]; void test(int* c, int*d){
for(int i = ; i <= n; i++){
cout<<i<<" dis "<< c[i]<<" cost "<<d[i]<<endl;
}
} void dijkstra(int s, int t)
{
int d[maxn], cost[maxn];
bool vis[maxn];
memset(vis, false, sizeof(vis));
for(int i = ; i < maxn; i++)
d[i] = cost[i] = INF;
d[s] = cost[s] = ; for(int i = ; i <= n; i++){
int k, mm = INF; for(int j = ; j <= n; j++) if(!vis[j] && d[j] < mm) { mm = d[j]; k = j; }
vis[k] = true; for(int j = ; j <= n; j++){
if(d[j] > d[k] + arr[k][j].dis){
d[j] = d[k] + arr[k][j].dis;
cost[j] = cost[k] + arr[k][j].cos;
}
else if(d[j] < INF && d[j] == d[k] + arr[k][j].dis && cost[j] > cost[k] + arr[k][j].cos){
cost[j] = cost[k] + arr[k][j].cos;
}
}
}
//test(d, cost);
printf("%d %d\n", d[t], cost[t]);
} int main(){
while(scanf("%d%d", &n, &m) == &&(n||m)){
for(int i = ; i <= n; i++){
for(int j = ; j <= n; j++)
{
arr[i][j].dis = arr[i][j].cos = (i == j)?:INF;
}
}
for(int i = ; i < m; i++){
int a, b, c, d;
scanf("%d%d%d%d", &a, &b, &c, &d);
if(c < arr[a][b].dis){
arr[a][b].dis = arr[b][a].dis = c;
arr[a][b].cos = arr[b][a].cos = d;
}
}
int s, t;
scanf("%d%d", &s, &t);
dijkstra(s, t);
}
return ;
}

hdu 2066 一个人的旅行  【多源多汇,基础最短路】

思路:邻接表存图。 多源多汇,所以考虑建立【超级原点】,通常为0点,该点到所有起点的距离都为0,然后就是裸的最短路了。

总结:不知道为什么在自己电脑上init()之后s就被莫名其妙地改变成和t一个值了。。。。但是无改动用C++交上去过了,= =||,如果谁知道为神马请告诉我一声,涩涩~~~

AC代码如下:

 //AC
#include<iostream>
#include<cstdio>
#include<queue>
#include<vector>
#include<limits.h>
#include<cstring>
using namespace std;
#define maxn 1010
#define INF INT_MAX-1000
struct node{
int v, wei;
};
vector<node> gra[maxn];
int t, s, d; int dis[maxn]; void init()
{
int i;
for(i = ; i <= maxn; i++)
gra[i].clear();
} void input()
{
for(int i = ; i < t; i++){
node re;
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
re.v = v; re.wei = w;
gra[u].push_back(re);
re.v = u;
gra[v].push_back(re);
}
for(int i = ; i < s; i++){
node re; re.wei = ;
scanf("%d", &re.v);
gra[].push_back(re);
int t = re.v; re.v = ;
gra[t].push_back(re);
}
} void output()
{
int ans = INF;
for(int i = ; i < d; i++){
int fina;
scanf("%d", &fina);
if(dis[fina] < ans) ans = dis[fina];
}
printf("%d\n", ans);
} void spfa()
{
bool inq[maxn]; memset(inq, , sizeof(inq));
for(int i = ; i < maxn; i++)
dis[i] = INF; queue<int> q;
q.push();
inq[] = true; dis[] = ;
while(!q.empty()){
int u = q.front(); q.pop();
inq[u] = false;
for(int i = ; i < gra[u].size(); i++){
int t = dis[u] + gra[u][i].wei;
int v = gra[u][i].v;
if(dis[v] > t){
dis[v] = t;
if(!inq[v]){
q.push(v);
inq[v] = true;
}
}
}
}
} int main()
{
while(scanf("%d%d%d", &t, &s, &d) != EOF){
init();
input();
spfa();
output();
}
return ;
}

同类型基础题如下:

1869 六度分离 Floyd最短路(water)

作者:u011652573 发表于2014-4-22 8:12:45 原文链接
阅读:82 评论:0 查看评论

[原]最短路专题【基础篇】(updating...)的更多相关文章

  1. [原]Java修炼 之 基础篇(二)Java语言构成

    上次的博文中Java修炼 之 基础篇(一)Java语言特性我们介绍了一下Java语言的几个特性,今天我们介绍一下Java语言的构成.        所谓的Java构成,主要是指Java运行环境的组成, ...

  2. 个性二维码开源专题<基础篇>

    二维码原理介绍: 二维码为什么是黑白相间的?黑色表示二进制的“1”,白色表示二进制的“0” “我们之所以对二维码进行扫描能读出那么多信息,就是因为这些信息被编入了二维码之中.”黄海平说,“制作二维码输 ...

  3. [原]Java修炼 之 基础篇(一)Java语言特性

    学习软件开发,首先要选择的就是选择需要采用的编程语言,考虑语言本身的优缺点和实际需求,综合评价之后选择相关的语言进行系统开发.本篇博客开始就从近年来比较流行的Java开始为大家讲起. 背景 1995年 ...

  4. Java面试专题-基础篇(1)

  5. [C# 基础知识梳理系列]专题六:泛型基础篇——为什么引入泛型

    引言: 前面专题主要介绍了C#1中的2个核心特性——委托和事件,然而在C# 2.0中又引入一个很重要的特性,它就是泛型,大家在平常的操作中肯定会经常碰到并使用它,如果你对于它的一些相关特性还不是很了解 ...

  6. Java面试题之基础篇概览

    Java面试题之基础篇概览 1.一个“.java”源文件中是否可以包含多个类(不是内部类)?有什么限制? 可以有多个类,但只能有一个public的类,且public的类名必须与文件名相一致. 2.Ja ...

  7. java学习笔记-基础篇

    Java基础篇 1—12 常识 13 this关键字 14参数传递 16 继承 17 访问权限 28—31异常 1—12 常识 1.文件夹以列表展示,显示扩展名,在地址栏显示全路径 2.javac编译 ...

  8. 小白—职场之Java基础篇

    java基础篇 java基础 目录 1.java是一种什么语言,jdk,jre,jvm三者的区别 2.java 1.5之后的三大版本 3.java跨平台及其原理 4.java 语言的特点 5.什么是字 ...

  9. Asp.Net Core基础篇之:白话管道中间件

    在Asp.Net Core中,管道往往伴随着请求一起出现.客户端发起Http请求,服务端去响应这个请求,之间的过程都在管道内进行. 举一个生活中比较常见的例子:旅游景区. 我们都知道,有些景区大门离景 ...

随机推荐

  1. cygwin chmod 失效

    问题背景 为了在 Cygwin 下使用之前最喜爱的 screen 命令, 安装 Cygwin 时就选上了 screen 来运行一把 ganiks.liu@MAMIS-Gaiks-Liu /tmp $ ...

  2. 读书笔记:<我是一只IT小小鸟>

    <我是一只IT小小鸟>第一次听到这本书的时候,我便有了深深的好奇,虽然我是一名学习软件工程的大学生,但是还是第一次听到“IT”这个名词,既陌生又好奇.听到老师提起了这本书的意义以及看法,我 ...

  3. 在listener或者工具中使用spring容器中的bean实例

    在项目中经常遇见需要在Listener中或者工具中使用Spring容器中的bean实例,由于bean不能在stataic的类中使用. 介绍一种方式: public class SpringTool { ...

  4. Promises与Javascript异步编程

    Promises与Javascript异步编程 转载:http://www.zawaliang.com/2013/08/399.html 在如今都追求用户体验的时代,Ajax应用真的是无所不在.加上这 ...

  5. JAVA swing中JPanel如何实现分组框的效果以及设置边框颜色 分类: Java Game 2014-08-16 12:21 198人阅读 评论(0) 收藏

    代码如下: import java.awt.FlowLayout; import java.awt.Frame; import java.awt.GridLayout; import javax.sw ...

  6. XSS的原理分析与解剖(二)

    0×01 前言:  上节(http://www.freebuf.com/articles/web/40520.html)已经说明了xss的原理及不同环境的构造方法.本期来说说XSS的分类及挖掘方法. ...

  7. 【ASP.Net MVC】在AspNet Mvc使用JQuery AutoComplete组件

    在AspNet Mvc使用JQuery AutoComplete组件 官方文档: http://api.jqueryui.com/autocomplete/#entry-examples 要使用JQu ...

  8. POJ1811 Prime Test(miller素数判断&&pollar_rho大数分解)

    http://blog.csdn.net/shiyuankongbu/article/details/9202373 发现自己原来的那份模板是有问题的,而且竟然找不出是哪里的问题,所以就用了上面的链接 ...

  9. HDU 4569 Special equations(数学推论)

    题目 //想不出来,看了解题报告 /* 题意:给你一个最高幂为4的一元多项式,让你求出一个x使其结果模p*p为0. 题解:f(x)%(p*p)=0那么一定有f(x)%p=0,f(x)%p=0那么一定有 ...

  10. POJ 1422

    #include <iostream> #define MAXN 350 using namespace std; int mat[MAXN][MAXN]; bool mark[MAXN] ...