A*

A*

定点第k短路

# include <bits/stdc++.h>
using namespace std;

typedef long long LL;
const int MAXN=1e3+100,MAXM=1e5+100;
#define INF 123456789
int n,m,s,t,k;
struct Edge{
   int next,to,w;
}edge[MAXM<<1];
int cnt=0;
int head[MAXN],hed[MAXN];
int dis[MAXN];
bool vis[MAXN];
void add(int u,int v,int w)
{
   edge[cnt].w=w;
   edge[cnt].to=v;
   edge[cnt].next=head[u];
   head[u]=cnt++;
}
void ad(int u,int v,int w)
{
   edge[cnt].w=w;
   edge[cnt].to=v;
   edge[cnt].next=hed[u];
   hed[u]=cnt++;
}
struct Dijkstra{
   void init()
  {
       scanf("%d%d",&n,&m);//点个数,路个数,起点,终点
       int u,v,c;
       for(int i=0;i<=n;i++){
           head[i]=-1,hed[i]=-1;
      }
       for(int k=0;k<m;k++){
           scanf("%d%d%d",&u,&v,&c);
           add(v,u,c);
           ad(u,v,c);
      }
       scanf("%d%d%d",&s,&t,&k);
       if(s==t) k++;
  }
   void solve()
  {
       memset(vis,0,sizeof(vis));
       fill(dis+1,dis+n+1,INF);
       dis[t]=0;
       for(int i=n;i>0;i--){
           int x,minn=INF;
           for(int j=n;j>0;j--){
               if(!vis[j]&&dis[j]<=minn) minn=dis[x=j];
          }
           vis[x]=1;
           for(int j=head[x];~j;j=edge[j].next){
               if(!vis[edge[j].to]&&dis[edge[j].to]>dis[x]+edge[j].w) dis[edge[j].to]=dis[x]+edge[j].w;
          }
      }
       //for(int i=1;i<=n;i++) cout<<dis[i]<<endl;
  }
};
Dijkstra Dij;
int nm[MAXN];
struct node{
   int x,l;
   node(int a=0,int b=0):x(a),l(b){};
};
bool operator>(const node a,const node b){
   return a.l>b.l;
}
int main()
{
   Dij.init();
   Dij.solve();
   priority_queue<node,vector<node>,greater<node> > pq;
   node aa; aa.x=s,aa.l=0+dis[s];
   pq.push(aa);
   int ans=-1;
   while(!pq.empty()){
       aa=pq.top();
       pq.pop();
       nm[aa.x]++;
       //cout<<"!!!!"<<aa.x<<" "<<aa.l<<endl;
       if(nm[aa.x]==k&&aa.x==t){
           ans=aa.l;
           break;
      }
       for(int i=hed[aa.x];~i;i=edge[i].next){
          // cout<<edge[i].to<<" "<<edge[i].w<<endl;
          if(nm[edge[i].to]<k){
               node bb; bb.x=edge[i].to,bb.l=aa.l-dis[aa.x]+edge[i].w+dis[edge[i].to];
               pq.push(bb);
          }
      }
  }
   printf("%d\n",ans);
   return 0;
}



posted @ 2022-02-26 23:32  fengzlj  阅读(62)  评论(0)    收藏  举报