POJ 2449 Remmarguts' Date (A* 第k短路)

原创 2016年08月31日 09:51:59

题目链接

给出n个点,m条边的有向图,问s到t的第k短路长度。

使用A*进行计算,每次不判重,把每一个点的相邻的所有状态加入到扩展集合中,判断t出队的次数为k就是k短路。 这里的 A *的H函数我们用单源最短路径计算从t到每个点的最短距离,因为是有向图计算的时候把图反向一下。

注意:当s==t的时候,k需要加以1。

//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
#define cl(a,b) memset(a,b,sizeof(a))
#define fastIO ios::sync_with_stdio(false);cin.tie(0);
#define LL long long
#define pb push_back
#define gcd __gcd


#define For(i,j,k) for(int i=(j);i<=k;i++)
#define lowbit(i) (i&(-i))
#define _(x) printf("%d\n",x)

typedef vector<LL> vec;
typedef pair<int,int> PI;
const double EPS = 1e-8;
const int maxn = 2e5;
const int inf  = 1 << 28;

vector<pair<int,int> > G[maxn];
vector<pair<int,int> > rG[maxn];
int n,m;
int s,t,k;

int H[maxn];
bool inq[maxn];
void spfa(){
    queue<int> q;
    cl(inq,false);
    fill(H,H+n+100,inf);
    q.push(t);
    H[t] = 0;
    inq[t] = true;
    while(!q.empty()){
        int u = q.front();q.pop();
        for(int i=0;i<rG[u].size();i++){
            int v = rG[u][i].first;
            int w = rG[u][i].second;
            if(H[v] > H[u] + w){
                H[v] = H[u] + w;
                if(!inq[v]){
                    inq[v] = true;
                    q.push(v);
                }
            }
        }
        inq[u] = false;
    }
}

struct node{
    int x;
    int F,G;//G函数 实际的步数
    bool operator<(const node&rhs) const{
        return F > rhs.F || F == rhs.F && G > rhs.G;
    }

}start,last,cur;

int bfs(){
    start = (node){s,0+H[s],0};
    priority_queue<node> q;
    q.push(start);
    while(!q.empty()){
        last = q.top();q.pop();
        if(last.x == t && --k == 0){
            return last.G;
        }
        for(int i=0;i<G[last.x].size();i++){
            int v = G[last.x][i].first;
            int w = G[last.x][i].second;
            //printf("v = %d, w = %d\n",v,w);
            cur.x = v;
            cur.G = last.G + w;
            cur.F = cur.G + H[v];
            q.push(cur);
        }
    }
    return -1;
}


int main(){
    while(~scanf("%d%d",&n,&m)){
        for(int i=0;i<=n;i++){
            G[i].clear();
            rG[i].clear();
        }
        for(int i=0;i<m;i++){
            int x,y,w;
            scanf("%d%d%d",&x,&y,&w);
            G[x].pb(make_pair(y,w));
            rG[y].pb(make_pair(x,w));
        }
        scanf("%d%d%d",&s,&t,&k);if(s==t)k++;

        spfa();

        int ans = bfs();
        printf("%d\n",ans);
    }
    return 0;
}
版权声明:一个菜逼的笔记,并没有什么题解。。。

POJ 2104 K-th Number(区间第k大数)(平方分割,归并树,划分树)

题目链接: http://poj.org/problem?id=2104 解题思路: 因为查询的个数m很大,朴素的求法无法在规定时间内求解。因此应该选用合理的方式维护数据来做到高效地查询。 如果x是...
  • piaocoder
  • piaocoder
  • 2015年08月25日 10:56
  • 1304

poj 3111 K Best ,二分,牛顿迭代

poj 3111  K Best 有n个物品的重量和价值分别是wi和vi。从中选出k个物品使得单位重量的价值最大。 题解: 1、二分做法 2、牛顿迭代 效率比较: 二分做法: 转换成判断...
  • yew1eb
  • yew1eb
  • 2014年08月21日 16:12
  • 2101

poj2253 用dijkstra计算最短路径的两个结点的最短长度

题意:就是一个青蛙A要到另一个青蛙B所在的石头上,因为水太脏不能游泳,所以A得通过连续的跳跃跳到B所在的石头上,题目给定每个石头的坐标,通过两点间公式计算出两点坐标,要求我们求出最短路径中青蛙跳的长度...
  • ZQUSwansea
  • ZQUSwansea
  • 2015年11月09日 10:29
  • 1915

POJ2449 Remmarguts' Date 【k短路】

Remmarguts' Date Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 21064 ...
  • u012846486
  • u012846486
  • 2014年08月14日 19:49
  • 669

[POJ 2449] Remmarguts' Date 第K短路

http://poj.org/problem?id=2449题意:输入 n, m 表示给一个 n 个顶点 m 条边的有向图,然后输入 m 条边,最后一行输入 s, t, k,要求这个图中 s 点到 t...
  • AcmHonor
  • AcmHonor
  • 2015年08月25日 16:59
  • 327

Remmarguts' Date poj2449 k短路 A*

Description给定n个点m条边起点st终点ed求k短路Solution嗯本蒟蒻第一题a*,还是很鸡冻的简单说来,每个节点包含估价函数f(i)=g(i)+h(i)f(i)=g(i)+h(i),其...
  • jpwang8
  • jpwang8
  • 2017年02月26日 19:45
  • 155

POJ 2449 Remmarguts' Date k短路 A*+Dijkstra

Remmarguts' Date Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 28497 Accept...
  • LuRiCheng
  • LuRiCheng
  • 2016年11月10日 21:10
  • 248

POJ 2449 Remmarguts' Date (第k短路 A*搜索算法模板)

POJ 2449 Remmarguts' Date (第k短路 A*搜索算法模板)
  • Tc_To_Top
  • Tc_To_Top
  • 2015年03月17日 23:57
  • 977

POJ2449-Remmarguts' Date(K短路)

题目链接http://poj.org/problem?id=2449题意求一个有向图的给定起点和终点的K短路思路A* + SPFA A*算法的核心是估价函数f(n) = g(n) + h(n)的设计...
  • Lzedo
  • Lzedo
  • 2016年09月02日 21:29
  • 130

POJ 2449 Remmarguts' Date ( Dijkstra + A* 求解第K短路 )

#include #include #include #include using namespace std; #define E 100005 #define V 1005 #defin...
  • u011659057
  • u011659057
  • 2014年10月20日 23:31
  • 980
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 2449 Remmarguts' Date (A* 第k短路)
举报原因:
原因补充:

(最多只允许输入30个字)