pku 2449 Remmarguts' Date 第K短路模板题目
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; }