poj 2449 第k短路

题目链接:http://poj.org/problem?id=2449

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

const int maxn = 1005;
const int maxe = 100050;
const int INF = 0x3f3f3f3f;

struct Edge{
    int v,w;
    int next;
    Edge(int v=0,int w=0,int next=0):
        v(v),  w(w), next(next){}
};
struct Heap{
    int u,f,g;
    Heap(int u=0,int f=0,int g=0): u(u), f(f), g(g){}
    bool operator < (const Heap& rhs) const{
        return f > rhs.f;
    }
};
int dist[maxn];

struct Dijkstra{
    Edge edges[maxe];
    int head[maxn],cnt;
    bool vis[maxn];

    void init(){
        memset(head,-1,sizeof(head));
        cnt = 0;
    }

    void addedge(int u,int v,int w){
        edges[cnt] = Edge(v,w,head[u]);
        head[u] = cnt++;
    }

    void solve(int s){
        memset(vis,0,sizeof(vis));
        memset(dist,0x3f,sizeof(dist));
        priority_queue<Heap> Q;
        Q.push(Heap(s,0,0));
        dist[s] = 0;

        while(!Q.empty()){
            Heap temp = Q.top(); Q.pop();
            int u = temp.u;
            int d = temp.f;
            if(vis[u])  continue;
            vis[u] = true;
            for(int i=head[u];i!=-1;i=edges[i].next){
                Edge& e = edges[i];
                if(dist[e.v] > d + e.w){
                    dist[e.v] = d + e.w;
                    Q.push(Heap(e.v,dist[e.v],0));
                }
            }
        }
    }
}solver1;

struct A_Star{
    Edge edges[maxe];
    int head[maxn],cnt;
    int num[maxn];

    void init(){
        memset(head,-1,sizeof(head));
        cnt = 0;
    }

    void addedge(int u,int v,int w){
        edges[cnt] = Edge(v,w,head[u]);
        head[u] = cnt++;
    }

    int solve(int s,int t,int k){
        memset(num,0,sizeof(num));
        priority_queue<Heap> Q;
        if(dist[s] >= INF)  return -1;
        Q.push(Heap(s,dist[s],0));

        while(!Q.empty()){
            Heap temp = Q.top();  Q.pop();
            int u = temp.u;
            num[u]++;
            if(num[t] == k){
                return temp.f;
            }
            if(num[u] > k){
                continue;
            }
            for(int i=head[u];i!=-1;i=edges[i].next){
                Edge& e = edges[i];
                int g = temp.g + e.w;
                int f = g + dist[e.v];
                Q.push(Heap(e.v,f,g));
            }
        }
        return -1;
    }
}solver2;

int main()
{
    //freopen("E:\\acm\\input.txt","r",stdin);
    int N,M;
    cin>>N>>M;
    solver1.init();
    solver2.init();
    for(int i=1;i<=M;i++){
        int u,v,w;
        scanf("%d %d %d",&u,&v,&w);
        solver1.addedge(v,u,w);
        solver2.addedge(u,v,w);
    }
    int s,t,k;
    scanf("%d %d %d",&s,&t,&k);
    solver1.solve(t);
    if(s == t)  k++;
    int ans = solver2.solve(s,t,k);
    printf("%d\n",ans);
}
View Code

 

posted @ 2013-09-03 11:44  等待最好的两个人  阅读(142)  评论(0编辑  收藏  举报