最短路

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. ssl证书部署问题

    问:我现在得到的ssl证书是.crt和.key两个在nginx环境下部署的证书,如果我们改用是tomcat,现在把这两个文件合成了.jks给tomcat使用,合成的时候输入的jks密码是不是就是部署在 ...

  2. jquery的show()和hide()方法

    显示和隐藏元素的方法 相当于CSS中的display属性 show()方法,相当于display:block hide()方法,相当于display:none

  3. SpringBoot之加载自定义配置文件

    SpringBoot默认加载配置文件名为:application.properties和application.yml,如果需要使用自定义的配置文件,则通过@PropertySource注解指定. J ...

  4. jaxp的dom方式操作(查找、添加、修改、删除、遍历节点)

    package cn.itcast.jaxptest; import java.io.IOException; import javax.xml.parsers.DocumentBuilder;imp ...

  5. ORACLE 增加两列字段

    declare v_cnt number; V_SQL VARCHAR2 (500) := '';begin select count(*) into v_cnt from dual where ex ...

  6. mvc 学前必知

    MVC无人不知,可很多程序员对MVC的概念的理解似乎有误,换言之他们一直在错用MVC,尽管即使如此软件也能被写出来,然而软件内部代码的组织方式却是不科学的,这会影响到软件的可维护性.可移植性,代码的可 ...

  7. hdu—3861(tarjan+二分图)

    题意:给你n个城市,每个城市之间有一条有向边,将城市划分为几个区域,问你最小的划分方法, 划分规则为:能相互到达的放在一个区域:然后区域内的a,b两点肯定存在某种方式,使得a能到b或者b能到a(注意, ...

  8. P1495 曹冲养猪

    原题链接 https://www.luogu.org/problemnew/show/P1495 这个题明显的中国剩余定理(孙子定理),如果有不懂孙子定理的点这个链接https://baike.bai ...

  9. Matplotlib学习---matplotlib的一些基本用法

    Matplotlib有两种接口,一种是matlab风格接口,一种是面向对象接口.在这里,统一使用面向对象接口.因为面向对象接口可以适应更复杂的场景,在多图之间进行切换将变得非常容易. 首先导入matp ...

  10. C#常用的命名规则汇总

    C#常用的命名规则汇总 来源 https://www.cnblogs.com/pengyouqiang88/p/5021128.html 本文转载自脚本之家 本文详细汇总了C#常用的命名规则.分享给大 ...