BZOJ 1598 牛跑步
Posted ziliuziliu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ 1598 牛跑步相关的知识,希望对你有一定的参考价值。
K短路,A*
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<algorithm> #define maxv 1050 #define maxe 10050 #define inf 1000000007 using namespace std; int n,m,k,x,y,z,g1[maxv],g2[maxv],dis[maxv],nume1=0,nume2=0,ans[maxv]; struct pnt { int id,val,val1; friend bool operator < (const pnt &x,const pnt &y) { return x.val>y.val; } pnt (int id,int val,int val1):id(id),val(val),val1(val1) {} pnt () {} }; struct edge { int v,w,nxt; }e1[maxe],e2[maxe]; priority_queue <pnt> q; queue <int> qr; bool vis[maxv]; void addedge(int u,int v,int w) { e1[++nume1].v=v;e1[nume1].w=w;e1[nume1].nxt=g1[u];g1[u]=nume1; e2[++nume2].v=u;e2[nume2].w=w;e2[nume2].nxt=g2[v];g2[v]=nume2; } void spfa() { for (int i=2;i<=n;i++) dis[i]=inf; qr.push(1);memset(vis,false,sizeof(vis)); while (!qr.empty()) { int head=qr.front();qr.pop();vis[head]=false; for (int i=g2[head];i;i=e2[i].nxt) { int v=e2[i].v; if (dis[v]>dis[head]+e2[i].w) { dis[v]=dis[head]+e2[i].w; if (!vis[v]) {qr.push(v);vis[v]=true;} } } } } void A_star() { q.push(pnt(n,0,0)); while (!q.empty()) { pnt head=q.top();q.pop(); if (head.id==1) { ans[++ans[0]]=head.val1; if (ans[0]==k) return; } for (int i=g1[head.id];i;i=e1[i].nxt) { int v=e1[i].v; pnt ret; ret.id=v;ret.val1=head.val1+e1[i].w;ret.val=ret.val1+dis[v]; q.push(ret); } } } int main() { scanf("%d%d%d",&n,&m,&k); for (int i=1;i<=m;i++) { scanf("%d%d%d",&x,&y,&z); addedge(x,y,z); } spfa(); A_star(); for (int i=1;i<=k;i++) { if (!ans[i]) printf("-1\n"); else printf("%d\n",ans[i]); } return 0; }
以上是关于BZOJ 1598 牛跑步的主要内容,如果未能解决你的问题,请参考以下文章
BZOJ_1598_[Usaco2008 Mar]牛跑步_A*