最短路

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. Centos rpm包安装PHP所需包

    yum -y install php php-devel php-fpm php-xml php-pdo php-ldap php-mysql

  2. python数据结构与算法第十一天【希尔排序】

    1.希尔排序的原理 2.代码实现 def shell_sort(alist): n = len(alist) # 初始步长 gap = n / 2 while gap > 0: # 按步长进行插 ...

  3. delphi怎样在关闭程序时弹出窗口?

    我想在关闭delphi编译的程序时,弹出“您是否确实要退出的窗口”点击否不退出,是退出 在主窗体的CloseQuery事件里,使用messagebox进行提示,根据选择的按钮对Canclose进行设置 ...

  4. 在文件保存中 os.getcwd() os.listdir() os.makedirs() os.mkdir() xx.join() ... 等函数 的使用介绍

    path = 'C:\\Users\\zhangjunming\\Desktop\\PycharmProjects\\my_mgm' 1.xx.join(obj)   以xx为分隔符 对obj中的元素 ...

  5. Linux命令替换字符串

    :%s/str1/str2/ 用str2替换str1

  6. poj2739(尺取法+质数筛)

    题意:给你一个数,问这个数能否等于一系列连续的质数的和: 解题思路:质数筛打出质数表:然后就是尺取法解决: 代码: #include<iostream> #include<algor ...

  7. [IOI2018]高速公路收费——二分查找+bfs

    题目链接: IOI2018highway 题目大意:给出一张$n$个点$m$条边的无向图,并给出一对未知的起点和终点,每条边都有两种边权$A$和$B$(每条边的$A$和$B$都分别相同),每次你可以设 ...

  8. Java json转model

    前面有一篇关于  json的转换类的工具:http://blog.csdn.net/hanjun0612/article/details/77891569 但是有一个情况. 由于java需要属性小写开 ...

  9. 查询SQL磁盘活动量信息

    /* 用来显示有关由 Transact-SQL 语句生成的磁盘活动量的信息.*/DBCC DROPCLEANBUFFERS --清空缓存set statistics io on --开启set sta ...

  10. Sorting It All Out POJ - 1094 拓扑排序

    题意:给N个字母,和M个偏序关系 求一个可确定的全序,可确定是指没有其他的可能例如A>B D>B 那么有ADB DAB两种,这就是不可确定的其中,M个偏序关系可以看做是一个一个按时间给出的 ...