POJ 2449 Remmarguts' Date

Remmarguts' Date

k短路模板

 

  1 #include<queue>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 using namespace std;
  6 const int maxn=1005;
  7 int n,m,s,t,k,num,head1[maxn],head2[maxn],dis[maxn],nxt1[maxn*100],nxt2[maxn*100],cnt;
  8 queue<int>q; bool vis[maxn];
  9 struct Edge{
 10     int u,v,d;
 11 }edge1[maxn*100],edge2[maxn*100];
 12 
 13 struct Data{
 14     int h,g,num;
 15     bool operator < (const Data x) const
 16     {
 17         if(h==x.h) return g>x.g;
 18         return h>x.h;
 19     }
 20 };
 21 
 22 char ch;
 23 inline void read(int &now)
 24 {
 25     ch=getchar(); now=0;
 26     while(ch>'9'||ch<'0') ch=getchar();
 27     while(ch>='0'&&ch<='9') now=now*10+ch-'0',ch=getchar();
 28 }
 29 
 30 void add_Edge(int u,int v,int d)
 31 {
 32     edge2[++num].u=u;
 33     edge2[num].v=v;
 34     edge2[num].d=d;
 35     nxt2[num]=head2[u];
 36     edge1[num].u=v;
 37     edge1[num].v=u;
 38     edge1[num].d=d;
 39     nxt1[num]=head1[v];
 40     head2[u]=num;
 41     head1[v]=num;
 42 }
 43 
 44 void spfa()
 45 {
 46     for(int i=0;i<=n;i++) dis[i]=0x7f;
 47     dis[t]=0;
 48     vis[t]=1;
 49     q.push(t);
 50     while(!q.empty())
 51     {
 52         int cur=q.front(); q.pop();
 53         for(int i=head2[cur];i;i=nxt2[i])
 54         {
 55             int v=edge2[i].v;
 56             if(dis[v]>dis[cur]+edge2[i].d)
 57             {
 58                 dis[v]=dis[cur]+edge2[i].d;
 59                 if(!vis[v])
 60                 {
 61                     vis[v]=1;
 62                     q.push(v);
 63                 }
 64             }
 65         }
 66         vis[cur]=0;
 67     }
 68 }
 69 
 70 int astar()
 71 {
 72     priority_queue<Data>que;
 73     if(s==t) k++;
 74     Data u,v,w;
 75     if(dis[s]==dis[0]) return -1;
 76     u.num=s;
 77     u.g=0;
 78     u.h=dis[s];
 79     que.push(u);
 80     while(!que.empty())
 81     {
 82         v=que.top(); que.pop();
 83         if(v.num==t) cnt++;
 84         if(cnt==k) return v.g;
 85         for(int i=head1[v.num];i;i=nxt1[i])
 86         {
 87             w.num=edge1[i].v;
 88             w.g=v.g+edge1[i].d;
 89             w.h=w.g+dis[edge1[i].v];
 90             que.push(w);
 91         }
 92     }
 93     return -1;
 94 }
 95 
 96 int main()
 97 {
 98     read(n); read(m);
 99     for(int i=1;i<=m;i++)
100     {
101         int x,y,z;
102         read(x); read(y); read(z);
103         add_Edge(y,x,z);
104     }
105     read(s); read(t); read(k);
106     spfa();
107     printf("%d\n",astar());
108     return 0;
109 }
1

 

posted @ 2017-09-03 19:27  Alex丶Baker  阅读(162)  评论(0编辑  收藏  举报