IT民工
加油!

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

 

 

 

posted on 2012-09-28 15:36  找回失去的  阅读(155)  评论(0)    收藏  举报