http://poj.org/problem?id=2449
题意:
给出图,给出起点与终点以及k求第k短路。
模板:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <string>
#define CL(a,num) memset((a),(num),sizeof(a))
#define iabs(x) ((x) > 0 ? (x) : -(x))
#define Min(a,b) (a) > (b)? (b):(a)
#define Max(a,b) (a) > (b)? (a):(b)
#define ll long long
#define inf 0x7f7f7f7f
#define MOD 1073741824
#define lc l,m,rt<<1
#define rc m + 1,r,rt<<1|1
#define pi acos(-1.0)
#define test puts("<------------------->")
#define maxn 100007
#define M 200004
#define N 1007
using namespace std;
//freopen("din.txt","r",stdin);
struct node
{
int v,w;
int next;
}zg[M],rg[M];
int zhead[N],zct;
int rhead[N],rct;
int dis[N];
bool vt[N];
int n,m,src,des,k;
struct A_node
{
int v,g;
bool operator < (A_node b) const
{
return (g + dis[v]) > (b.g + dis[b.v]);
}
}p1,p2;
void addz(int u,int v,int w)
{
zg[zct].v = v;
zg[zct].w = w;
zg[zct].next = zhead[u];
zhead[u] = zct++;
}
void addr(int u,int v,int w)
{
rg[rct].v = v;
rg[rct].w = w;
rg[rct].next = rhead[u];
rhead[u] = rct++;
}
void spfa(int s)
{
int i;
for (i = 1; i <= n; ++i)
{
dis[i] = inf;
vt[i] = false;
}
dis[s] = 0; vt[s] = true;
queue<int>q;
q.push(s);
while (!q.empty())
{
int u = q.front(); q.pop();
vt[u] = false;
for (i = rhead[u]; i != - 1; i = rg[i].next)
{
int v = rg[i].v;
int w = rg[i].w;
if (dis[v] > dis[u] + w)
{
dis[v] = dis[u] + w;
if (!vt[v])
{
vt[v] = true;
q.push(v);
}
}
}
}
}
int cnt[N];
priority_queue<A_node> pq;
int A_star(int s,int t,int k)
{
int i;
int ans = -1;
CL(cnt,0);
while (!pq.empty()) pq.pop();
if (s == t) k++;//注意当s==t时需要计算K+1短路,因为s到t这条距离为0的路不能算在这K短路中,这时只需将K++
p1.g = 0; p1.v = s;
pq.push(p1);
while (!pq.empty())
{
p2 = pq.top(); pq.pop();
int u = p2.v;
int gi = p2.g;
cnt[u]++;
if (cnt[u] > k) continue;
if (cnt[t] == k)
{
ans = gi;
break;
}
for (i = zhead[u]; i != -1; i = zg[i].next)
{
int v = zg[i].v;
int w = zg[i].w;
p1.v = v; p1.g = gi + w;
pq.push(p1);
}
}
return ans;
}
int main()
{
// freopen("din.txt","r",stdin);
int i;
int x,y,z;
while (~scanf("%d%d",&n,&m))
{
CL(zhead,-1); zct = 0;
CL(rhead,-1); rct = 0;
for (i = 0; i < m; ++i)
{
scanf("%d%d%d",&x,&y,&z);
addz(x,y,z);
addr(y,x,z);
}
scanf("%d%d%d",&src,&des,&k);
spfa(des);
printf("%d\n",A_star(src,des,k));
}
return 0;
}