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