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

来源:互联网 发布:网络兼职插画师 编辑:程序博客网 时间:2024/06/07 20:56

题意:

给一张图,求解两点之间的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;}


0 0
原创粉丝点击