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;
}

  

 

posted @ 2013-01-22 21:04  E_star  阅读(214)  评论(0编辑  收藏  举报