POJ2449 (k短路)

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
using namespace std;

#define maxn 2008
#define maxm 2000008
#define INF 2000000000

int lt[maxn],LT[maxn],sum=1,SUM=1;
int h[maxn];
int s,t,k,n,m;
bool pd[maxn];

struct line{
    int u,v,w,nt;
}eg[maxm],EG[maxm];

inline void add(int u,int v,int w){
    eg[++sum].u=u; eg[sum].v=v; eg[sum].w=w; eg[sum].nt=lt[u]; lt[u]=sum;
}
inline void ADD(int u,int v,int w){
    EG[++SUM].u=u; EG[SUM].v=v; EG[SUM].w=w; EG[SUM].nt=LT[u]; LT[u]=SUM;
}
inline void read(int &x){
    char ch;
    for (ch=getchar();ch<‘0‘||ch>‘9‘;ch=getchar()); x=ch-48;
    for (ch=getchar();ch>=‘0‘&&ch<=‘9‘;ch=getchar()) x=x*10+ch-48;
}

inline void spfa(){
    queue<int> Q;
    for (int i=1;i<=n;i++) h[i]=INF;
    memset(pd,0,sizeof(pd));
     h[t]=0; pd[t]=1; Q.push(t);
     while (!Q.empty()){
         int u=Q.front(); Q.pop();
         for (int i=LT[u];i;i=EG[i].nt){
             int v=EG[i].v;
             if (h[u]+EG[i].w<h[v]){
                 h[v]=h[u]+EG[i].w;
                 if (!pd[v]){
                     pd[v]=1;
                     Q.push(v);
                 }
             }
         }
         pd[u]=0;
     }
}

class node{
public:
    int f,g,u;
    bool operator<(const node& t) const{
        return f>t.f;
    }
    node(int a,int b,int c):f(a),g(b),u(c){}
    node(){}
};

int iQ[maxn];
inline int A_star(){
    priority_queue<node> Q;
    memset(iQ,0,sizeof(iQ));
    iQ[s]=0; Q.push(node(h[s],0,s));
    while (!Q.empty()){
        node cur=Q.top();
        //printf("%d %d %d %d\n",cur.f,cur.g,cur.u,iQ[t]);
        Q.pop();
        iQ[cur.u]++;
        if (iQ[t]==k) return cur.f;
        if (iQ[cur.u]>k) continue;

        for (int i=lt[cur.u];i;i=eg[i].nt){
            int v=eg[i].v;
            Q.push(node(h[v]+cur.g+eg[i].w,cur.g+eg[i].w,v));
        }
    }
    return -1;
}

inline int main(){
    //freopen("1.in","r",stdin);
    read(n); read(m);
    for (int i=1;i<=m;i++) {
        int u,v,w;
        read(u); read(v); read(w);
        add(u,v,w);
        ADD(v,u,w);
    }
    read(s); read(t); read(k);
    if (s==t) k++;
    spfa();
    //for (int i=1;i<=n;i++) printf("%d ",h[i]);
    printf("%d\n",A_star());
    return 0;
}
时间: 2024-10-11 09:45:10

POJ2449 (k短路)的相关文章

poj2449 k短路问题

这个题就是让你求出S点到T点的第K短路, 使用A*搜索就可以, 搜索使用两个指标函数 h g, h表示从源点到当前点的最短路, g点表示从当前点到汇点的最短路, 搜索的时候v顶点第k次出队时的h就是第k短路的长度, 代码如下: #include <cstdio> #include <cstring> #include <algorithm> #include <queue> #include <vector> using namespace st

POJ2449:K短路

Remmarguts' Date Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 26355   Accepted: 7170 Description "Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. Softly touching his little ducks' head, h

poj2449 Remmarguts&#39; Date,第K短路

点击打开链接 SPFA  + A* #include <cstdio> #include <queue> #include <cstring> #include <algorithm> using namespace std; struct node { int v, dis, f, next; friend bool operator <(node a, node b){ return a.f>b.f; } }; const int INF =

POJ2449 Remmarguts&#39; Date 【k短路】

Remmarguts' Date Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 21064   Accepted: 5736 Description "Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. Softly touching his little ducks' head, h

POJ2449 Remmarguts&#39; Date 第K短路

POJ2449 比较裸的K短路问题 K短路听起来高大上 实际思路并不复杂 首先对终点t到其他所有点求最短路 即为dist[] 然后由起点s 根据当前走过的距离+dist[]进行A*搜索 第k次到达t即为第K短路 代码也很简单 //数组开的不够 不一定是运行时错误! 可能也会WA #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath&g

[poj2449]Remmarguts&#39; Date(K短路模板题,A*算法)

解题关键:k短路模板题,A*算法解决. #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<iostream> #include<cmath> #include<queue> using namespace std; typedef long long ll; const int N=1e3+10; const

(WA)POJ2449 第K短路

POJ2449 第K短路 改了好长时间发现读入读反了qwq A*,先在反向图上求出每个点到t的最短距离,作为估价函数即可 疑问:能不能直接记录h+g 1 #include <cstdio> 2 #include <cstring> 3 #include <cctype> 4 #include <algorithm> 5 #include <queue> 6 #include <iostream> 7 using namespace s

poj2449:第k短路问题

Description "Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. Softly touching his little ducks' head, he told them a story. "Prince Remmarguts lives in his kingdom UDF – United Delta of Freedom. One

poj2449 第k短路

题目链接 学习博客:https://blog.csdn.net/Z_Mendez/article/details/47057461 k短路没有我想象的那么难,还是很容易理解的 求s点到t点的第k短路径 先求出t到所有点的最短路径,用g[i]表示t到i的距离 从s开始"bfs",按照(g[i]+bfs路过的长度)构造优先队列,比如刚开始bfs路过长度为0,所在点为s 一直选择最小的(g[i]+bfs路过的长度),第一次到达t一定是从s沿着最短路径到达. 直到第k次到达t 理解代码可能更容

次短路 + 第K短路 模版

虽然从字面上看,次短路和第2短路是一样的.但是我在题目中遇到的却不是这样的. 在有些题目中,需要判断次短路是否存在.比如说,u.v之间只有一条路径.那么只有最短路.次短路是不存在的.这时候,解题方法是先求出最短路,然后枚举删除最短路径中的边,然后求最小值.题目可以看poj3986. 第K短路的实现是 SPFA + A* 算法. A*算法通过一个估价函数f(h)来估计途中的当前点p到终点的距离,并由此决定它的搜索方向,当这条路径失败时,它会尝试其他路径.对于A*,估价函数 = 当前值 + 当前位置