POJ 2449 Remmarguts' Date

K短路 dij + Astar

 

/*Accepted    9904K    282MS    C++    2223B    2012-09-28 15:30:02*/

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <algorithm>

#include <queue>

using namespace std;

const int INF = 0x3f3f3f3f;

const int MAXN = 1 << 10;

const int MAXM = 100 * MAXN;

typedef pair<int, int> pii;



struct edge

{

    int next, v, w;

}e[MAXM << 1];



int es, es2, f1[MAXN], f2[MAXN];

int n, m, S, T, K;

int cal[MAXN], d[MAXN];

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

{

    e[es].v = v, e[es].w = w;

    e[es].next = f1[u], f1[u] = es ++;

    e[es2].v = u, e[es2].w = w;

    e[es2].next = f2[v], f2[v] = es2 ++;

}



void ReadGraph()

{

    memset(f1, -1, sizeof f1);

    memset(f2, -1, sizeof f2);

    es = 0, es2 = m;

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

    {

        int u, v, w;

        scanf("%d%d%d", &u, &v, &w);

        addedge(u, v, w);

    }

    scanf("%d%d%d", &S, &T, &K);

    if(S == T) K ++;

}



priority_queue<pii, vector<pii>, greater<pii> > q;



void dijkstra(int s, int totn)

{

    for(int i = 1; i <= totn; i ++)

    {

        d[i] = (i == s ? 0 : INF);

        cal[i] = 0;

    }

    q.push(make_pair(0, s));

    while(!q.empty())

    {

        pii p = q.top();

        q.pop();

        int u = p.second;

        if(cal[u]) continue;

        cal[u] = 1;

        for(int i = f2[u]; i != -1; i = e[i].next)

        {

            int v = e[i].v;

            if(d[v] > d[u] + e[i].w)

            {

                d[v] = d[u] + e[i].w;

                q.push(make_pair(d[v], v));

            }

        }

    }

}



int Kth_Astar(int s, int t, int k)

{

    if(d[s] == INF) return -1;

    q.push(make_pair(d[s], s));

    memset(cal, 0, sizeof cal);

    while(!q.empty())

    {

        pii p = q.top();

        q.pop();

        int u = p.second;

        cal[u] ++;

        if(cal[u] > k) continue;

        if(cal[t] == k) return p.first;

        for(int i = f1[u]; i != -1; i = e[i].next)

        {

            int v = e[i].v;

            q.push(make_pair(p.first - d[u] + e[i].w + d[v], v));

        }

    }

    return -1;

}



int main()

{

    while(scanf("%d%d", &n, &m) != EOF)

    {

        ReadGraph();

        dijkstra(T, n);

        printf("%d\n", Kth_Astar(S, T, K));

    }

    return 0;

}

 

 

 

你可能感兴趣的:(Date)