poj 2449(Remmarguts' Date)

View Code
  1 #include<stdio.h>
  2 #include<iostream>
  3 #include<queue>
  4 #include<string.h>
  5 using namespace std;
  6 #define inf 0x7ffffff
  7 #define N 100010
  8 #define M 1010
  9 struct edge{
 10     int w,to,next;
 11 }e1[N],e2[N];
 12 struct node{
 13     int w,u;
 14     bool operator <(const node &x)const
 15     {
 16         return w>x.w;
 17     }
 18 };
 19 struct node1{
 20     int f,g,u;
 21     bool operator <(const node1 &x)const
 22     {
 23         return f>x.f;
 24     }
 25 };
 26 int cnt;
 27 int pre1[M],pre2[M],dist[M];
 28 void add(int a,int b,int w)
 29 {
 30     e1[cnt].next=pre1[a];
 31     e1[cnt].w=w;
 32     e1[cnt].to=b;
 33     pre1[a]=cnt;
 34     e2[cnt].next=pre2[b];
 35     e2[cnt].w=w;
 36     e2[cnt].to=a;
 37     pre2[b]=cnt++;
 38 }
 39 void dijstra(int s,int n,int pre[],edge e[])
 40 {
 41     priority_queue<node> q;
 42     for(int i=0;i<=n;i++)
 43     dist[i]=inf;
 44     dist[s]=0;
 45     node in;
 46     in.w=0;
 47     in.u=s;
 48     q.push(in);
 49     while(!q.empty())
 50     {
 51         node out=q.top();
 52         q.pop();
 53         int u=out.u;
 54         int w=out.w;
 55         for(int edg=pre[u];edg!=0;edg=e[edg].next)
 56         {
 57             int v=e[edg].to;
 58             if(dist[v]>dist[u]+e[edg].w)
 59             {
 60                 dist[v]=dist[u]+e[edg].w;
 61                 in.w=dist[v];
 62                 in.u=v;
 63                 q.push(in);
 64             }
 65         }
 66     }
 67 }
 68 int Astar(int s,int t,int k,int pre[],edge e[])
 69 {
 70     priority_queue<node1> q;
 71     int cnt1=0;
 72     node1 in;
 73     in.u=s;
 74     in.g=0;
 75     in.f=dist[s];
 76     q.push(in);
 77     while(!q.empty())
 78     {
 79         node1 out=q.top();
 80         q.pop();
 81         int g=out.g;
 82         int u=out.u;
 83         if(u==t)cnt1++;
 84         if(cnt1==k)return out.f;
 85         for(int edg=pre[u];edg!=0;edg=e[edg].next)
 86         {
 87             int v=e[edg].to;
 88             in.u=v;
 89             in.g=g+e[edg].w;
 90             in.f=in.g+dist[v];
 91             q.push(in);
 92         }
 93     }
 94     return -1;
 95 }
 96 int main()
 97 {
 98     int m,n,k;
 99     while(scanf("%d%d",&n,&m)!=EOF)
100     {
101         memset(pre1,0,sizeof(pre1));
102         memset(pre2,0,sizeof(pre2));
103         cnt=1;
104         int a,b,w;
105         while(m--)
106         {
107             scanf("%d%d%d",&a,&b,&w);
108             add(a,b,w);
109         }
110         int s,t,k;
111         scanf("%d%d%d",&s,&t,&k);
112         if(s==t)k++;
113         dijstra(t,n,pre2,e2);
114         printf("%d\n",Astar(s,t,k,pre1,e1));
115     }
116     return 0;
117 }
原文地址:https://www.cnblogs.com/huangriq/p/2447068.html