首页 > 其他 > 详细

Remmarguts’ Date(poj 2449)

时间:2016-09-17 21:58:40      阅读:147      评论:0      收藏:0      [点我收藏+]

求第k短路的长度,如果没有,输出-1。

技术分享
/*
  k短路模板
  注意当s=t时,k++。 
*/
#include<iostream>
#include<cstdio>
#include<queue>
#define N 1010
#define M 100010
using namespace std;
int head1[N],head2[N],dis[N],vis[N],n,m,k,cnt;
bool flag;
struct node
{
    int v,pre,t;
};node e1[M],e2[M];
struct Node
{
    int from,g,f;
    bool operator< (Node x) const
    {
        if(x.f!=f)return x.f<f;
        return x.g<g;
    }
};
void add(int i,int x,int y,int z)
{
    e1[i].v=y;
    e1[i].t=z;
    e1[i].pre=head1[x];
    head1[x]=i;
    e2[i].v=x;
    e2[i].t=z;
    e2[i].pre=head2[y];
    head2[y]=i;
}
void spfa(int s,int t)
{
    queue<int> q;
    for(int i=1;i<=n;i++)dis[i]=N*M;
    vis[s]=1;dis[s]=0;
    q.push(s);
    while(!q.empty())
    {
        int x=q.front();q.pop();
        vis[x]=0;
        for(int i=head2[x];i;i=e2[i].pre)
          if(dis[e2[i].v]>dis[x]+e2[i].t)
          {
              dis[e2[i].v]=dis[x]+e2[i].t;
              if(!vis[e2[i].v])
              {
                  vis[e2[i].v]=1;
                  q.push(e2[i].v);
            }
          }
    }
}
void a_star(int s,int t)
{
    if(s==t)k++;
    priority_queue<Node> q;
    Node u;u.from=s;u.g=0;u.f=dis[s];
    q.push(u);
    while(!q.empty())
    {
        u=q.top();q.pop();
        if(u.from==t)
        {
            cnt++;
            if(cnt==k)
            {
                printf("%d",u.f);
                flag=true;
                return;
            }
        }
        for(int i=head1[u.from];i;i=e1[i].pre)
        {
            Node v;
            v.from=e1[i].v;
            v.g=u.g+e1[i].t;
            v.f=v.g+dis[e1[i].v];
            q.push(v);
        }
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        add(i,x,y,z);
    }
    int s,t;
    scanf("%d%d%d",&s,&t,&k);
    spfa(t,s);
    a_star(s,t);
    if(!flag)printf("-1");
    return 0;
}
View Code

 

Remmarguts’ Date(poj 2449)

原文:http://www.cnblogs.com/harden/p/5879746.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!