poj 3255 Roadblocks

http://poj.org/problem?id=3255

第k短路

#include<iostream>

#include<cstdio>

#include<algorithm>

#include<cmath>

#include<queue>

#include<string.h>



using namespace std;



const int N=5001;

const int M=200005;

const int MAX=0x5fffffff;

int head[N];

struct node

{

    int j,k;

    int next;

}side[M];

int dist[N];

bool in[N];

struct tt

{

    int f,g;

    int x;

    bool operator <(const tt a) const

    {

        if(a.f==f)

        return a.g<g;

        return a.f<f;

    }

};

void build(int x,int i)

{

    side[i].next=head[x];

    head[x]=i;

}

void spfa(int n)

{

    queue<int>str;

    memset(in,false,sizeof(false));

    for(int i=1;i<=n;++i)

    dist[i]=MAX;

    dist[n]=0;

    in[n]=true;

    str.push(n);

    while(!str.empty())

    {

        int x=str.front();

        str.pop();

        in[x]=false;

        for(int t=head[x];t!=-1;t=side[t].next)

        {

            if(dist[side[t].j]>dist[x]+side[t].k)

            {

                dist[side[t].j]=dist[x]+side[t].k;

                if(!in[side[t].j])

                {

                   in[side[t].j]=true;

                   str.push(side[t].j);

                }

            }

        }

    }

}

int Astar(int n)

{

    tt k1,k2;

    priority_queue< tt >str;

    k1.f=dist[1];

    k1.g=0;

    k1.x=1;

    str.push(k1);

    int ans=-1;

    while(!str.empty())

    {

        k1=str.top();

        str.pop();

        int x=k1.x;

        if(x==n)

        {

            if(ans==-1)

            {

                ans=k1.g;

            }else

            {//cout<<k1.g<<" "<<ans<<endl;

                if(k1.g>ans)

                return k1.g;

            }

        }

        for(int t=head[x];t!=-1;t=side[t].next)

        {

            k2.x=side[t].j;

            if(dist[k2.x]==MAX)

            continue;

            k2.g=k1.g+side[t].k;

            k2.f=k2.g+dist[k2.x];

            str.push(k2);

        }

    }

    return ans;

}

int main()

{

    //freopen("data.txt","r",stdin);

    int n,m;

    while(scanf("%d %d",&n,&m)!=EOF)

    {

        memset(head,-1,sizeof(head));

        for(int i=0;i<m;++i)

        {

            int x,y,k;

            scanf("%d %d %d",&x,&y,&k);

            side[i].j=y;

            side[i].k=k;

            build(x,i);

            side[i+m].j=x;

            side[i+m].k=k;

            build(y,i+m);

        }

        spfa(n);

        printf("%d\n",Astar(n));

    }

    return 0;

}

  

你可能感兴趣的:(block)