(poj 2449 Remmarguts' Date)

傳送門


Solution

推幾個b站講A*的視頻(全英文沒字幕看個p系列。。霧)


Code

// by spli
#include<cstring>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;

const int N=1010;
const int M=100010;
int n,m,s,t,k;
struct node{
    int to,nxt,val;
}e1[M],e2[M];int h1[N],h2[N],c1,c2;
int dis[N];
bool vis[N];
queue<int>q;
struct A{
    int id,f,g;
    bool operator <(const A &b)const{
        return b.f==f?b.g<g:(b.f<f);
    }
};
priority_queue<A>Q;

void add1(int f,int t,int v){
    c1++;
    e1[c1]=(node){t,h1[f],v};
    h1[f]=c1;
}

void add2(int f,int t,int v){
    c2++;
    e2[c2]=(node){t,h2[f],v};
    h2[f]=c2;
}

void spfa(){
    memset(dis,0x7f,sizeof(dis));
    dis[t]=0;vis[t]=1;q.push(t);
    while(!q.empty()){
        int u=q.front();
        q.pop();
        vis[u]=0;
        for(int i=h2[u];i!=-1;i=e2[i].nxt){
            int v=e2[i].to;
            if(dis[v]>dis[u]+e2[i].val){
                dis[v]=dis[u]+e2[i].val;
                if(!vis[v]){
                    vis[v]=1;
                    q.push(v);
                }
            }
        }
    }
}

void A_star(){
    int cnt=0;
    int f,g;
    if(s==t) k++;//可以說是很無恥了
    Q.push((A){s,dis[s],0});
    while(!Q.empty()){
        A u=Q.top();
        Q.pop();
        if(u.id==t){
            cnt++;
            if(cnt==k){
                printf("%d\n",u.g);
                return;
            }
        }
        for(int i=h1[u.id];i!=-1;i=e1[i].nxt){
            int v=e1[i].to;
            g=u.g+e1[i].val;
            f=g+dis[v];
            Q.push((A){v,f,g});
        }
    }
    printf("-1");
}

int main(){
    memset(h1,-1,sizeof(h1));
    memset(h2,-1,sizeof(h2));
    scanf("%d%d",&n,&m);
    int x,y,z;
    for(int i=1;i<=m;++i){
        scanf("%d%d%d",&x,&y,&z);
        add1(x,y,z);add2(y,x,z);
    }
    scanf("%d%d%d",&s,&t,&k);
    spfa();
    A_star();
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章