(poj 2449 Remmarguts' Date)<A*-K短路模板>

来源:互联网 发布:windows解压war包 编辑:程序博客网 时间:2024/06/07 01:30

传送门


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;}
原创粉丝点击