第K短路。
A*经典问题:
要求两点间的K短路,则图中一个点最多如队列K次(这些都是结论),

#define MAXN 10005
constint INTMAX =0x7f7f7f7f;
int minl[MAXN],vis[MAXN];
int n, m, stx, sty, k, mark;
struct node {
int x;
int dis;
}u,s,v,t;
struct edge {
int v;
int dis;
}p;
vector<edge> mat[10005];
vector<edge> matT[10005];
priority_queue<node> Q;
inline booloperator< (const node a,const node b) {
return (a.dis + minl[a.x]) > (b.dis + minl[b.x]);
}
void bfs() {
if(stx == sty) k++;
if(minl[stx] >= INTMAX) {printf("-1\n");return ;}
SETQ(Q);
u.x = stx,u.dis =0;
Q.push(u);
while(!Q.empty()) {
v = Q.top();Q.pop();
//DB(v.x);
vis[v.x]++;
if(vis[sty] == k) {
printf("%d\n",v.dis + minl[v.x]);
return ;
}
if(vis[v.x] >k) continue;
for (int i =0;i<mat[v.x].size() ;i++ ) {
t.x = mat[v.x][i].v;
t.dis = v.dis + mat[v.x][i].dis;
Q.push(t);
}
}
printf("-1\n");
}
/*void dijstra() {
int v[MAXN],i, j, k;
for (i=0; i<=n;i++) {
minl[i] = INTMAX,v[i] = 0;
}
for (minl[sty]=0,j=0;j<n;j++) {
for ( k =-1,i=1;i<=n ;i++ ) {
if(!v[i]&&(k==-1||minl[i]<minl[k]))
k=i;
}
for (v[k] = 1,i = 1;i<=n ;i++ ) {
if(!v[i]&&(matt[k][i]!=-1))
minl[i]=min(minl[k]+matt[k][i],minl[i]);
}
}
}*/
void spfa(int s) {
int i;
bool used[10005]; SET(used,false);
for (i =0;i<10005 ;i++ ) {
minl[i] = INTMAX;
}
minl[s] =0; used[s] =true;
queue<int> q; q.push(s);
while(!q.empty()) {
int u = q.front();
q.pop(); used[u] =false;
for (i =0;i< matT[u].size();i++ ) {
p = matT[u][i];
if (minl[p.v] > minl[u] + p.dis) {
minl[p.v] = minl[u] + p.dis;
if (!used[p.v]) {
used[p.v] =true;
q.push(p.v);
}
}
}
}
}
void init() {
for (int i =0;i<10005 ;i++ ) {
mat[i].clear();
matT[i].clear();
}
SET(vis,0);
int a,b,c;
for (int i=0; i<m;i++) {
SCFT(a,b,c);
p.v = b;
p.dis = c;
mat[a].push_back(p);
p.v = a;
matT[b].push_back(p);
}
SCFT(stx,sty,k);//DB(stx<<"--"<<sty<<"--"<<k);
spfa(sty);
}
int main() {
while (~SCFD(n,m)){
init();
bfs();
}
}