pku 2449 Remmarguts' Date 第K短路模板题目

http://poj.org/problem?id=2449

题意:

给出图,给出起点与终点以及k求第k短路。

模板:

#include <iostream>

#include <cstdio>

#include <cstdlib>

#include <cstring>

#include <algorithm>

#include <cmath>

#include <queue>

#include <stack>

#include <set>

#include <map>

#include <string>



#define CL(a,num) memset((a),(num),sizeof(a))

#define iabs(x)  ((x) > 0 ? (x) : -(x))

#define Min(a,b) (a) > (b)? (b):(a)

#define Max(a,b) (a) > (b)? (a):(b)



#define ll long long

#define inf 0x7f7f7f7f

#define MOD 1073741824

#define lc l,m,rt<<1

#define rc m + 1,r,rt<<1|1

#define pi acos(-1.0)

#define test puts("<------------------->")

#define maxn 100007

#define M 200004

#define N 1007

using namespace std;

//freopen("din.txt","r",stdin);

struct node

{

    int v,w;

    int next;

}zg[M],rg[M];

int zhead[N],zct;

int rhead[N],rct;





int dis[N];

bool vt[N];

int n,m,src,des,k;



struct A_node

{

    int v,g;

    bool operator < (A_node b) const

    {

        return (g + dis[v]) > (b.g + dis[b.v]);

    }

}p1,p2;







void addz(int u,int v,int w)

{

    zg[zct].v = v;

    zg[zct].w = w;

    zg[zct].next = zhead[u];

    zhead[u] = zct++;

}

void addr(int u,int v,int w)

{

    rg[rct].v = v;

    rg[rct].w = w;

    rg[rct].next = rhead[u];

    rhead[u] = rct++;

}



void spfa(int s)

{

    int i;

    for (i = 1; i <= n; ++i)

    {

        dis[i] = inf;

        vt[i] = false;

    }

    dis[s] = 0; vt[s] = true;

    queue<int>q;

    q.push(s);

    while (!q.empty())

    {

        int u = q.front(); q.pop();

        vt[u] = false;

        for (i = rhead[u]; i != - 1; i = rg[i].next)

        {

            int v = rg[i].v;

            int w = rg[i].w;

            if (dis[v] > dis[u] + w)

            {

                dis[v] = dis[u] + w;

                if (!vt[v])

                {

                    vt[v] = true;

                    q.push(v);

                }

            }

        }

    }

}



int cnt[N];

priority_queue<A_node> pq;



int A_star(int s,int t,int k)

{

    int i;

    int ans = -1;

    CL(cnt,0);

    while (!pq.empty()) pq.pop();



    if (s == t) k++;//注意当s==t时需要计算K+1短路,因为s到t这条距离为0的路不能算在这K短路中,这时只需将K++

    p1.g = 0; p1.v = s;

    pq.push(p1);

    while (!pq.empty())

    {

        p2 = pq.top(); pq.pop();

        int u = p2.v;

        int gi = p2.g;

        cnt[u]++;

        if (cnt[u] > k) continue;

        if (cnt[t] == k)

        {

            ans = gi;

            break;

        }



        for (i = zhead[u]; i != -1; i = zg[i].next)

        {

            int v = zg[i].v;

            int w = zg[i].w;

            p1.v = v; p1.g = gi + w;

            pq.push(p1);

        }

    }

    return ans;

}



int main()

{

   // freopen("din.txt","r",stdin);

    int i;

    int x,y,z;

    while (~scanf("%d%d",&n,&m))

    {

        CL(zhead,-1); zct = 0;

        CL(rhead,-1); rct = 0;

        for (i = 0; i < m; ++i)

        {

            scanf("%d%d%d",&x,&y,&z);

            addz(x,y,z);

            addr(y,x,z);

        }

        scanf("%d%d%d",&src,&des,&k);

        spfa(des);

        printf("%d\n",A_star(src,des,k));

    }

    return 0;

}

  

 

你可能感兴趣的:(Date)