k短路


k短路dijkstra(堆优化)

首先A*算法主要思想是
估价函数
进而夹带一个BFS的思想
对所有边进行松弛
进而对每个点进行改变
最后加一个特判
以防RE;
k短路的模版题
直接上代码
有一点小小的读入优化不懂的话可以直接用scanf

#include
using namespace std;
const int INF=0x7fffffff;
const int M=50005;
int m,n,k,p,ans[M],cnt;
int d[M];
bool vis[M];
int read()
{ int x=0,f=1;char ch=getchar();
  while (ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();}
  while (ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}
  return x*f;
}
struct edge
{ int to,dist;}; vector g[M],lg[M]; 
struct node
{ int pos;
  int dis;
  bool operator<(const node & x) const 
  { return x.dis<dis;
  }
};
struct headnode
{ int pos;
  int g;
  int step;
  bool operator<(const headnode & x) const 
  { return (x.g==g)?x.stepg;
  }
};
priority_queue que;
priority_queue q;
void dijkstra(int s)
{ for (int i=1;i<=n;i++) d[i]=INF;
  d[s]=0;que.push((node){s,0});
  while (!que.empty())
  { node tmp=que.top();que.pop();
    int x=tmp.pos;
    if (vis[x]) continue;
    vis[x]=true;
    for (int i=0;i)
    { int y=lg[x][i].to,dd=lg[x][i].dist;
      if (d[y]>d[x]+dd) 
      { d[y]=d[x]+dd;
       if (!vis[y]) {que.push((node){y,d[y]});}
     }
    }
  }
}
int shrt[M];
void A_star(int s)
{ memset(ans,-1,sizeof(ans));
  headnode zz,mm;
  zz.g=0;zz.pos=s;zz.step=0;
  q.push(zz);
  while (!q.empty()) 
  { mm=q.top();q.pop();
    int x=mm.pos;
    shrt[x]++;
    if (shrt[x]>k) continue;
    if (x==1)
    { cnt++;
      ans[cnt]=mm.step;
      continue;
    }
    for (int i=0;i)
    { int y=g[x][i].to,dd=g[x][i].dist;
      zz.pos=y;zz.step=mm.step+dd;zz.g=zz.step+d[y];
      q.push(zz);
    }
  }
}
int main()
{ n=read();m=read();k=read();
  for (int i=1;i<=m;i++)
  { int x,y,z;
    x=read();y=read();z=read();
    g[x].push_back((edge){y,z});
    lg[y].push_back((edge){x,z});
  }
  dijkstra(1);
  A_star(n);
  for (int i=1;i<=k;i++)
  printf("%d\n",ans[i]);
  return 0;
}

相关