题目链接:http://poj.org/problem?id=2449

题目:

题意:求有向图两点间的k短路。

思路:最短路+A*算法

代码实现如下:

 #include <set>
#include <map>
#include <queue>
#include <stack>
#include <cmath>
#include <bitset>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; typedef long long ll;
typedef unsigned long long ull; #define lson i<<1
#define rson i<<1|1
#define bug printf("*********\n");
#define FIN freopen("D://code//in.txt", "r", stdin);
#define debug(x) cout<<"["<<x<<"]" <<endl;
#define IO ios::sync_with_stdio(false),cin.tie(0); const double eps = 1e-;
const int mod = ;
const int maxn = 1e5 + ;
const double pi = acos(-);
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f; inline int read() {//读入挂
int ret = , c, f = ;
for(c = getchar(); !(isdigit(c) || c == '-'); c = getchar());
if(c == '-') f = -, c = getchar();
for(; isdigit(c); c = getchar()) ret = ret * + c - '';
if(f < ) ret = -ret;
return ret;
} int n, m, s, t, u, v, w, k, tot;
int d[maxn<<], cnt[maxn<<], vis[maxn<<];
int head[maxn<<], head1[maxn<<];
pair<int, int> P; struct b {
int v, w, next;
}biao[maxn<<]; struct node {
int g, h;
int to;
bool operator < (node a) const {
return (a.h + a.g) < h + g;
}
}; void add(int u, int v, int w) {
biao[tot].v = v;
biao[tot].w = w;
biao[tot].next = head[u];
head[u] = tot++; biao[tot].v = u;
biao[tot].w = w;
biao[tot].next = head1[v];
head1[v] = tot++;
} void init() {
tot = ;
memset(head, -, sizeof(head));
memset(head1, -, sizeof(head1));
} void spfa() {
memset(vis, , sizeof(vis));
memset(d, inf, sizeof(d));
d[t] = ;
vis[t] = ;
queue<int> q;
q.push(t);
while(!q.empty()) {
int u = q.front();
q.pop();
vis[u] = ;
for(int i = head1[u]; i != -; i = biao[i].next) {
int v = biao[i].v;
if(d[v] > d[u] + biao[i].w) {
d[v] = d[u] + biao[i].w;
if(!vis[v]) {
q.push(v);
vis[v] = ;
}
}
}
}
} int AA() {
memset(cnt, , sizeof(cnt));
priority_queue<node> Q;
node p, q;
p.g = ;
p.h = d[s];
p.to = s;
Q.push(p);
while(!Q.empty()) {
p = Q.top(), Q.pop();
cnt[p.to]++;
if(cnt[p.to] > k) continue;
if(cnt[t] == k) return p.g;
int u = p.to;
for(int i = head[u]; i != -; i = biao[i].next) {
int v = biao[i].v;
q.to = v;
q.g = p.g + biao[i].w;
q.h = d[v];
Q.push(q);
}
}
return -;
} int main() {
//FIN;
scanf("%d%d", &n, &m);
init();
while(m--) {
scanf("%d%d%d", &u, &v, &w);
add(u, v, w);
}
scanf("%d%d%d", &s, &t, &k);
spfa();
if(s == t) k++;
int ans = AA();
printf("%d\n", ans);
return ;
}

Remmarguts' Date(POJ2449+最短路+A*算法)的更多相关文章

  1. POJ 2449 Remmarguts' Date ( 第 k 短路 && A*算法 )

    题意 : 给出一个有向图.求起点 s 到终点 t 的第 k 短路.不存在则输出 -1 #include<stdio.h> #include<string.h> #include ...

  2. poj 2449 Remmarguts' Date(K短路,A*算法)

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u013081425/article/details/26729375 http://poj.org/ ...

  3. poj 2449 Remmarguts' Date 第k短路 (最短路变形)

    Remmarguts' Date Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 33606   Accepted: 9116 ...

  4. poj 2449 Remmarguts' Date (k短路模板)

    Remmarguts' Date http://poj.org/problem?id=2449 Time Limit: 4000MS   Memory Limit: 65536K Total Subm ...

  5. 【POJ】2449.Remmarguts' Date(K短路 n log n + k log k + m算法,非A*,论文算法)

    题解 (搬运一个原来博客的论文题) 抱着板题的心情去,结果有大坑 就是S == T的时候也一定要走,++K 我发现按照论文写得\(O(n \log n + m + k \ log k)\)算法没有玄学 ...

  6. POJ2449 Remmarguts' Date 第K短路

    POJ2449 比较裸的K短路问题 K短路听起来高大上 实际思路并不复杂 首先对终点t到其他所有点求最短路 即为dist[] 然后由起点s 根据当前走过的距离+dist[]进行A*搜索 第k次到达t即 ...

  7. POJ 2449 - Remmarguts' Date - [第k短路模板题][优先队列BFS]

    题目链接:http://poj.org/problem?id=2449 Time Limit: 4000MS Memory Limit: 65536K Description "Good m ...

  8. 【POJ】2449 Remmarguts' Date(k短路)

    http://poj.org/problem?id=2449 不会.. 百度学习.. 恩. k短路不难理解的. 结合了a_star的思想.每动一次进行一次估价,然后找最小的(此时的最短路)然后累计到k ...

  9. POJ 2449 Remmarguts' Date (SPFA + A星算法) - from lanshui_Yang

    题目大意:给你一个有向图,并给你三个数s.t 和 k ,让你求从点 s 到 点 t 的第 k 短的路径.如果第 k 短路不存在,则输出“-1” ,否则,输出第 k 短路的长度. 解题思路:这道题是一道 ...

随机推荐

  1. 团队作业7——第二次项目冲刺(Beta版本)-第三篇

    1.工作分工: 团队成员 分工 郭达22120 项目整合,后台代码 刘德培44060 前台界面优化 石浩洋22061 前台界面优化 曾繁钦22056 前台界面优化.测试 孙斌22030 后台代码 2. ...

  2. 【Linux】- CentOS安装Mysql 5.7

    CentOS7默认数据库是mariadb,而不是mysql.CentOS7的yum源中默认是没有mysql的.所以不能使用yum install直接安装. 下载mysql的repo源 cd /usr/ ...

  3. 简单java死锁设计002

    /** * 死锁举例 * @author lenovo * */ public class DeadlockTest { private static Object obj1 = new Object ...

  4. Microsoft Edge goes Chromium

    Microsoft Edge goes Chromium https://techcrunch.com/2018/12/06/microsoft-edge-goes-chromium-and-maco ...

  5. BZOJ 1095 捉迷藏(线段树维护括号序列)

    对于树的一个括号序列,树上两点的距离就是在括号序列中两点之间的括号匹配完之后的括号数... 由此可以得出线段树的做法.. #include<cstdio> #include<iost ...

  6. Andorid API Package ---> android.accessibilityservice

    包名: android.accessibilityservice                     Added in API level 4 URL:http://developer.andro ...

  7. c# 日志记录 行号

    Console.WriteLine(ex.Message); //通过如下代码来记录异常详细的信息 ); Console.WriteLine("文件名:{0},行号:{1},列号:{2}&q ...

  8. bzoj 2424: [HAOI2010]订货 (费用流)

    直接费用流,天数就是点数 type arr=record toward,next,cap,cost:longint; end; const maxm=; maxn=; mm=<<; var ...

  9. 洛谷 P3332 [ZJOI2013]K大数查询 解题报告

    P3332 [ZJOI2013]K大数查询 题目描述 有\(N\)个位置,\(M\)个操作.操作有两种,每次操作如果是\(\tt{1\ a\ b\ c}\)的形式表示在第\(a\)个位置到第\(b\) ...

  10. POJ. 2253 Frogger (Dijkstra )

    POJ. 2253 Frogger (Dijkstra ) 题意分析 首先给出n个点的坐标,其中第一个点的坐标为青蛙1的坐标,第二个点的坐标为青蛙2的坐标.给出的n个点,两两双向互通,求出由1到2可行 ...