poj 2449 Remmarguts' Date(K短路,A*算法)
版权声明:本文为博主原创文章。未经博主同意不得转载。 https://blog.csdn.net/u013081425/article/details/26729375
http://poj.org/problem?id=2449
大致题意:给出一个有向图,求从起点到终点的第K短路。
K短路与A*算法具体解释 学长的博客。。
。
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <math.h>
#include <string.h>
#include <queue>
#include <string>
#define LL long long
#define _LL __int64
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 1010;
const int maxm = 100010;
struct node
{
int u,v,w;
};
int s,t,k;
int n,m;
vector <struct node> edge[maxn],edge1[maxn]; //邻接表存图以及反向图
int dis[maxn]; // 终点到全部点的最短路
int time[maxn];// 每一个点的出队列次数
int ans;
bool operator > (const struct node &a, const struct node &b)
{
return a.w+dis[a.v] > b.w + dis[b.v];
}
priority_queue < node, vector<node>, greater<node> >q;
void init()
{
for(int i = 1; i <= n; i++)
{
edge[i].clear();
edge1[i].clear();
}
}
//spfa求终点到其它左右点的最短路
void spfa()
{
int inque[maxn];
queue<int> que;
while(!que.empty()) que.pop();
memset(inque,0,sizeof(inque));
memset(dis,INF,sizeof(dis));
dis[t] = 0;
inque[t] = 1;
que.push(t);
while(!que.empty())
{
int u = que.front();
que.pop();
inque[u] = 0;
for(int i = 0; i < (int)edge1[u].size(); i++)
{
int v = edge1[u][i].v;
int w = edge1[u][i].w;
if(dis[v] > dis[u] + w)
{
dis[v] = dis[u] + w;
if(!inque[v])
{
inque[v] = 1;
que.push(v);
}
}
}
}
}
void solve()
{
while(!q.empty()) q.pop();
memset(time,0,sizeof(time));
struct node tmp;
bool flag = false;
//起点进队列
tmp.v = s;
tmp.w = 0;
q.push(tmp);
while(!q.empty())
{
struct node u = q.top();
q.pop();
time[u.v]++;
if(time[u.v] >= k) //出队次数大于等于K时
{
if(u.v == t) //假设是终点,推断与起点是否同样
//若不同样,当前值便是第K短路。否则第K+1次才是最短路
{
if(t != s || (t == s && time[u.v] == k+1))
{
flag = true;
ans = u.w;
break;
}
}
if(time[u.v] > k)//假设不是终点。当出队次数大于K次就不再进队列
continue;
}
int now = u.v;
for(int i = 0; i < (int)edge[now].size(); i++)
{
struct node tmp;
tmp.v = edge[now][i].v;
tmp.w = u.w + edge[now][i].w;
q.push(tmp);
}
}
if(!flag)
ans = -1;
}
int main()
{
while(~scanf("%d %d",&n,&m))
{
init();
int u,v,w;
for(int i = 1; i <= m; i++)
{
scanf("%d %d %d",&u,&v,&w);
edge[u].push_back( (struct node){u,v,w} );
edge1[v].push_back( (struct node) {v,u,w} );
}
scanf("%d %d %d",&s,&t,&k);
spfa();
solve();
printf("%d\n",ans);
}
return 0;
}
poj 2449 Remmarguts' Date(K短路,A*算法)的更多相关文章
- POJ 2449 Remmarguts' Date (K短路 A*算法)
题目链接 Description "Good man never makes girls wait or breaks an appointment!" said the mand ...
- poj 2449 Remmarguts' Date K短路+A*
题目链接:http://poj.org/problem?id=2449 "Good man never makes girls wait or breaks an appointment!& ...
- POJ 2449 Remmarguts' Date --K短路
题意就是要求第K短的路的长度(S->T). 对于K短路,朴素想法是bfs,使用优先队列从源点s进行bfs,当第K次遍历到T的时候,就是K短路的长度. 但是这种方法效率太低,会扩展出很多状态,所以 ...
- POJ 2449 Remmarguts' Date ( 第 k 短路 && A*算法 )
题意 : 给出一个有向图.求起点 s 到终点 t 的第 k 短路.不存在则输出 -1 #include<stdio.h> #include<string.h> #include ...
- poj 2449 Remmarguts' Date(第K短路问题 Dijkstra+A*)
http://poj.org/problem?id=2449 Remmarguts' Date Time Limit: 4000MS Memory Limit: 65536K Total Subm ...
- POJ 2449 求第K短路
第一道第K短路的题目 QAQ 拿裸的DIJKSTRA + 不断扩展的A* 给2000MS过了 题意:大意是 有N个station 要求从s点到t点 的第k短路 (不过我看题意说的好像是从t到s 可能是 ...
- 图论(A*算法,K短路) :POJ 2449 Remmarguts' Date
Remmarguts' Date Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 25216 Accepted: 6882 ...
- POJ 2449 Remmarguts' Date(第k短路のA*算法)
Description "Good man never makes girls wait or breaks an appointment!" said the mandarin ...
- POJ 2449 - Remmarguts' Date - [第k短路模板题][优先队列BFS]
题目链接:http://poj.org/problem?id=2449 Time Limit: 4000MS Memory Limit: 65536K Description "Good m ...
随机推荐
- 大年三十。让字母在屏幕上奔跑:(sleep , system"clear")
system "clear",ruby清屏(osk系统上,window上用system "cls"). https://stackoverflow.com/qu ...
- Sasha and a Very Easy Test CodeForces - 1109E (数学,线段树)
大意: 给定n元素序列, q个操作: (1)区间乘 (2)单点除(保证整除) (3)区间求和对m取模 要求回答所有操作(3)的结果 主要是除法难办, 假设单点除$x$, $x$中与$m$互素的素因子可 ...
- Leetcode 73
class Solution { public: void setZeroes(vector<vector<int>>& matrix) { vector<vec ...
- pycharm在创建py文件时,自动添加文件头注释
File -> settings -> Editor-> File and Code Templates -> Python Script 添加内容: #!/usr/bin/e ...
- POJ 3481 SBT做法
第三次做此题.. 不解释啦. 不过变成用SBT来做啦! SBT好处在于能够保证树的高度为lgn,真真正正的平衡二叉树. 因此删除,插入操作与普通二叉树几乎相同. #include <cstdio ...
- dup的使用(二)
转自:http://blog.csdn.net/yeyuangen/article/details/6852682 一个进程在此存在期间,会有一些文件被打开,从而会返回一些文件描述符,从shell中运 ...
- _Python定义方法
def 定义一个方法 在项目编程中,我们往往要做很多重复的事,比如一个排序的功能(当然Python中内置排序的方法),在编程中,我们肯定是会多次用到这个功能的,如果我们每次都在要用这个功能时,都去写一 ...
- 封装一个简单的原生js焦点轮播图插件
轮播图实现的效果为,鼠标移入左右箭头会出现,可以点击切换图片,下面的小圆点会跟随,可以循环播放(为了方便理解,没有补2张图做无缝轮播).本篇文章的主要目的是分享封装插件的思路. 轮播图我一开始是写成非 ...
- Ionic实现自定义返回按键事件
在 Android 和 Window 平台下,有时候我们需要监听返回按键的事件来进行相应的操作,也就是自定义返回按键事件.下面根据一个例子来讲解如何在 ionic 中自定义返回按键事件. 功能需求 首 ...
- cas HttpServletRequestWrapperFilter
HttpServletRequestWrapperFilter 作用其实很简单就是 在HttpServletRequest对象在包装一次,让其支持getUserPrincipal,getRemoteU ...