uva 10740 Not the Best 两点之间的K短路径

题意:

给一张图,求解两点之间的K短路径 如果不存在,输出-1

解题思路:

不会。。。。套模板:A*+SPFA

code:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;

//int n,m;

const int N = 105, M=1005;
const int INF = 0x3f3f3f3f;
struct node
{
    int to, w, next;
};
node edge[M],edge1[M];
int head[N], dist[N], outq[N], head1[N], tot, tot1;
bool vis[N];


bool SPFA(int s, int n )
{
    int i,k;
    for(i=0;i<=n;i++) dist[i]=INF;
    memset(vis,0,sizeof(vis));
    memset(outq,0,sizeof(outq));
    queue<int > q;
    while(!q.empty()) q.pop();
    vis[s]=1;
    dist[s]=0;
    q.push(s);
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        vis[u]=0;
        outq[u]++;
        if(outq[u]>n) return 0 ;
        k=head1[u];
        while(k>=0)
        {
            if(dist[edge1[k].to]-edge1[k].w>dist[u])
            {
                dist[edge1[k].to]=dist[u]+edge1[k].w;
                if(!vis[edge1[k].to])
                {
                    vis[edge1[k].to]=1;
                    q.push(edge1[k].to);
                }
            }
            k=edge1[k].next;
        }
    }
    return 1;
}
struct Node1
{
    int to;
    int g,f;
    bool operator<(const Node1 &r) const
    {
        if(r.f==f) return r.g<g;
        return r.f<f;
    }
};

int a_star(int start, int End, int k,int n)
{
    Node1 e,ne;
    int cnt=0;
    priority_queue<Node1> que;
    while(!que.empty()) que.pop();
    if(start==End) k++;
    if(dist[start]==INF) return -1;
    e.to=start;
    e.g=0;
    e.f=e.g+ dist[e.to];
    que.push(e);
    while(!que.empty())
    {
        e= que.top();
        que.pop();
        if(e.to==End) cnt++;
        if(cnt==k) return e.g;
        for(int i=head[e.to];i!=-1;i=edge[i].next)
        {
            ne.to=edge[i].to;
            ne.g=e.g+ edge[i].w;
            ne.f=ne.g+ dist[ne.to];
            que.push(ne);
        }
    }
    return -1;
}
void addedge(int i,int j,int w)
{
    edge[tot].to=j;
    edge[tot].w=w;
    edge[tot].next=head[i];
    head[i]=tot++;
}
void addedge1(int i,int j,int w)
{
    edge1[tot1].to=j;
    edge1[tot1].w=w;
    edge1[tot1].next=head1[i];
    head1[i]=tot1++;
}
void init()
{
    tot=0;tot1 = 0;
    memset(head,-1,sizeof(head));
    memset(head1,-1,sizeof(head1));
}
int main(){
    int n,m;
    while(~scanf("%d%d",&n,&m))
    {
        if(n==0&&m==0)break;
        init();
        int S,T,K;
        scanf("%d%d%d",&S,&T,&K);
        int a,b,c;
        for(int i = 0; i < m; i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            addedge(a,b,c);
            addedge1(b,a,c);
        }
        SPFA(T,n);
        int ans = a_star(S,T,K,n);
        printf("%d\n",ans);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值