最短路

luogu 3371

https://www.luogu.org/problemnew/show/P3371

 #include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn=1e4+; int dist[maxn];
bool vis[maxn]; struct node
{
int d,len;
///相反
bool operator<(const node & b) const
{
return b.len<len; ///b.d放在左边,方便
}
}; priority_queue<node> st;///这样写就可以了,省略后面的部分
vector<pair<int,int> >e[maxn]; int main()
{
int n,m,s,x,y,z,d,i;
vector<pair<int,int> >::iterator j;
scanf("%d%d%d",&n,&m,&s);
for (i=;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
//有向边
e[x].push_back(make_pair(y,z));
}
memset(dist,0x7f,sizeof(dist));
dist[s]=;
st.push({s,});
///点可以重复在priority_queue出现
while ()
{
///该点已被处理
///若st为空,执行st.top()会报错
while (!st.empty() && vis[st.top().d])
st.pop();
///必不可少
if (st.empty())
break;
///以dist[d]为点d的最短路为基础,进行拓展
d=st.top().d;
vis[d]=;///!
st.pop();///!
for (j=e[d].begin();j!=e[d].end();j++)
if (dist[j->first]>dist[d]+j->second)
{
dist[j->first]=dist[d]+j->second;
st.push({j->first,dist[j->first]});
}
}
for (i=;i<=n;i++)
{
if (i!=)
printf(" ");
printf("%d",dist[i]==dist[]?:dist[i]);
}
return ;
}

次短路

poj3255

http://poj.org/problem?id=3255

 #include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn=5e3+;
int ci=; ///次短路,可以推广位k短路(当然k要较小),此时dist的第二维的大小需要增加,第二维的数据修改也要修改 struct node
{
int d,len;
node *next;
}*e[maxn]; struct rec
{
int d,dist;
bool operator<(const rec &b) const
{
return b.dist<dist;
}
};
priority_queue<rec> st; int hap[maxn],dist[maxn][]; int main()
{
int i,a,b,c,n,m,d,dis,dd,ddis;
node *p;
scanf("%d%d",&n,&m);
for (i=;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
p=new node();
p->d=b;
p->len=c;
p->next=e[a];
e[a]=p; p=new node();
p->d=a;
p->len=c;
p->next=e[b];
e[b]=p;
} ///from 1 to n
memset(dist,0x7f,sizeof(dist));
dist[][]=;
st.push({,});
while ()
{
while (!st.empty() && hap[st.top().d]==ci)
st.pop();
///if not exists(not break in the next period)
if (st.empty())
break; ///确定了d,dist是第hap[d]小,以此为基础拓展其它点的第一小和第二小
d=st.top().d;
dis=st.top().dist;
hap[d]++;
st.pop(); if (d==n && hap[d]==)
break; p=e[d];
while (p)
{
dd=p->d;
ddis=dis+p->len;
if (ddis<dist[dd][])
{
dist[dd][]=dist[dd][];
dist[dd][]=ddis;
st.push({dd,ddis});///{d,dis[dd][1]}已经在优先队列里了
}
else if (ddis<dist[dd][])
{
dist[dd][]=ddis;
st.push({dd,ddis});
}
p=p->next;
}
}
///if not exists
printf("%d",dist[n][]);
return ;
}

最短路 次短路 k短路(k很小)的更多相关文章

  1. BZOJ-1975 魔法猪学院 K短路 (A*+SPFA)

    1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1323 Solved: 433 [Submit][Statu ...

  2. bzoj 1975 [Sdoi2010]魔法猪学院(k短路)

    题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的:元素与 ...

  3. Bzoj 1975: [Sdoi2010]魔法猪学院 dijkstra,堆,A*,K短路

    1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1357  Solved: 446[Submit][Statu ...

  4. WC2015 k小割(k短路+暴力+搜索)

    首先这道题不是非同一般的恶心,三个数据层次对应三个程序= = PROBLEM:http://uoj.ac/problems解法: 1~2直接暴力枚举边的选择与否+判断就行了 7~14可以发现是一个平面 ...

  5. POJ 2449 Dijstra + A* K短路

    这题一开始的思路应该是直接从源点进行BFS搜索K短路. 但这样的复杂度在点数和K的值增大后将会变得很大. 而A*算法则构造一个h(x),在进行BFS时,每次都抛出最小的h(x)从而使汇点的出队速度加快 ...

  6. 【k短路&A*算法】BZOJ1975: [Sdoi2010]魔法猪学院

    Description 找出1~k短路的长度.   Solution k短路的求解要用到A*算法 A*算法的启发式函数f(n)=g(n)+h(n) g(n)是状态空间中搜索到n所花的实际代价 h(n) ...

  7. K短路 (A*算法) [Usaco2008 Mar]牛跑步&[Sdoi2010]魔法猪学院

    A*属于搜索的一种,启发式搜索,即:每次搜索时加一个估价函数 这个算法可以用来解决K短路问题,常用的估价函数是:已经走过的距离+期望上最短的距离 通常和Dijkstra一起解决K短路 BZOJ1598 ...

  8. poj2449 第k短路

    题目链接 学习博客:https://blog.csdn.net/Z_Mendez/article/details/47057461 k短路没有我想象的那么难,还是很容易理解的 求s点到t点的第k短路径 ...

  9. Remmarguts' Date POJ - 2449 (A*搜索|k短路)

    "Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. ...

随机推荐

  1. python之路--BOM和DOM

    一. 介绍 之前学的JS的一些简单的语法并没有和浏览器有任何的交互. 我们要想制作一些我们经常看到的网页的一些交互,我们需要继续学习BOM和DOM相关知识. JavaScript 分为 ECMAScr ...

  2. Spring 的java 配置方式

    Java配置是Spring4.x推荐的配置方式,可以完全替代xml配置. 1.1@Configuration 和 @Bean Spring的Java配置方式是通过 @Configuration 和 @ ...

  3. 在windows 7 和linux上安装xlwt和xlrd

    在windows 7上安装xlwt xlrd xlwt是开源社区编写的python库,需要单独安装,下载地址https://pypi.python.org/pypi/xlwt 目前xlwt最新的版本是 ...

  4. k8s HPA自动收缩

    HPA自动收缩 autoscale 自动调整一个 Deployment, ReplicaSet, 或者 ReplicationController 的副本数量 #创建一个replicaset测试 [r ...

  5. Oracle minus用法详解及应用实例

    本文转载:https://blog.csdn.net/jhon_03/article/details/78321937 Oracle minus用法 “minus”直接翻译为中文是“减”的意思,在Or ...

  6. 关于PHP函数传参的注意点

    PHP的实参在传递过程中是顺序传递的,不支持指定参数名传递.怎么理解呢?看下面的代码: function test($name,$age){ echo '姓名:'.$name,' 年纪:'.$age; ...

  7. C#中decimal,double和float的区别

    float 单精度浮点 32bit,double 双精度浮点64bit,decimal是高精度 128bit,浮点型.float double 是 基本类型(primitive type),decim ...

  8. ES 6 系列 - 赋值的新方式:解构赋值

    变量的解构赋值 es 6 允许按照一定的模式,从数组和对象中提取值,然后对变量进行赋值,这被称之为解构: 一.数组的解构赋值 最基本写法: let [a, b, c] = [1, 2, 3]; a / ...

  9. 14.statefulset服务

    有状态的控制器有以下几个特点 稳定,独特的网络标识符. 稳定,持久的存储. 有序,优雅的部署和扩展. 有序的自动滚动更新. 使用限制 StatefulSet是1.9之前的beta资源,在1.5之前的任 ...

  10. source 和 .

    Linux Source命令及脚本的执行方式解析 当我修改了/etc/profile文件,我想让它立刻生效,而不用重新登录:这时就想到用source命令,如:source /etc/profile 对 ...