最短路 次短路 k短路(k很小)
最短路
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很小)的更多相关文章
- BZOJ-1975 魔法猪学院 K短路 (A*+SPFA)
1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1323 Solved: 433 [Submit][Statu ...
- bzoj 1975 [Sdoi2010]魔法猪学院(k短路)
题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的:元素与 ...
- Bzoj 1975: [Sdoi2010]魔法猪学院 dijkstra,堆,A*,K短路
1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1357 Solved: 446[Submit][Statu ...
- WC2015 k小割(k短路+暴力+搜索)
首先这道题不是非同一般的恶心,三个数据层次对应三个程序= = PROBLEM:http://uoj.ac/problems解法: 1~2直接暴力枚举边的选择与否+判断就行了 7~14可以发现是一个平面 ...
- POJ 2449 Dijstra + A* K短路
这题一开始的思路应该是直接从源点进行BFS搜索K短路. 但这样的复杂度在点数和K的值增大后将会变得很大. 而A*算法则构造一个h(x),在进行BFS时,每次都抛出最小的h(x)从而使汇点的出队速度加快 ...
- 【k短路&A*算法】BZOJ1975: [Sdoi2010]魔法猪学院
Description 找出1~k短路的长度. Solution k短路的求解要用到A*算法 A*算法的启发式函数f(n)=g(n)+h(n) g(n)是状态空间中搜索到n所花的实际代价 h(n) ...
- K短路 (A*算法) [Usaco2008 Mar]牛跑步&[Sdoi2010]魔法猪学院
A*属于搜索的一种,启发式搜索,即:每次搜索时加一个估价函数 这个算法可以用来解决K短路问题,常用的估价函数是:已经走过的距离+期望上最短的距离 通常和Dijkstra一起解决K短路 BZOJ1598 ...
- poj2449 第k短路
题目链接 学习博客:https://blog.csdn.net/Z_Mendez/article/details/47057461 k短路没有我想象的那么难,还是很容易理解的 求s点到t点的第k短路径 ...
- Remmarguts' Date POJ - 2449 (A*搜索|k短路)
"Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. ...
随机推荐
- python之路--JavaScript
一. JavaScript概述 ECMAScript和JavaScript的关系 1996年11月,JavaScript的创造者--Netscape公司,希望这门语言能成为国际化标准,于是决定将Jav ...
- ansible的playbook简单使用
一.介绍 playbook就是一个用yaml语法把多个模块堆起来的一个文件 核心组件: Hosts:执行的远程主机列表Tasks:任务,由模块定义的操作的列表:Varniables:内置变量或自定义变 ...
- eclipse 等号左边代码补全
1: 2. 3.完成 “ctrl + shift + l” 代码补全成功
- Codeforces#543 div2 A. Technogoblet of Fire(阅读理解)
题目链接:http://codeforces.com/problemset/problem/1121/A 真·阅读理解 题意就是 有n个人 pi表示他们的强度 si表示他们来自哪个学校 现在Arkad ...
- 洛谷-p2764(最小路径覆盖)(网络流24题)
#include<iostream> #include<algorithm> #include<queue> #include<cstring> #in ...
- [离散时间信号处理学习笔记] 9. z变换性质
z变换描述 $x[n] \stackrel{\mathcal{Z}}{\longleftrightarrow}X(z) ,\quad ROC=R_x$ 序列$x[n]$经过z变换后得到复变函数$X(z ...
- Tcp协议的keepalive功能
L:128
- Android热修复原理
参考:https://www.cnblogs.com/popfisher/p/8543973.html 一. AndFix AndFix的原理就是方法的替换,把有bug的方法替换成补丁文件中的方法. ...
- ScheduledThreadPoolExecutor 吞异常
线程挂掉不一定会输出日志到控制台,比如ScheduledThreadPoolExecutor,如果在执行的任务中有未捕获的异常抛出,就行停止调度,没有任何错误输出到控制台或日志文件.在项目中这会导致一 ...
- BZOJ2480Spoj3105 Mod&BZOJ1467Pku3243 clever Y——EXBSGS
题目描述 已知数a,p,b,求满足a^x≡b(mod p)的最小自然数x. 输入 每个测试文件中最多包含100组测试数据. 每组数据中,每行包含3个正整数a,p,b. 当a=p ...