挖坑防忘,天亮补题解。
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#pragma comment(linker, "/STACK:1024000000");
#define EPS (1e-8)
#define LL long long
#define ULL unsigned long long LL
#define _LL __int64
#define _INF 0x3f3f3f3f
#define Mod 1000000007
using namespace std;
const int MAXN = 100100;
struct N
{
int u,v,w,next,ty;
}edge[2*MAXN];
int head[MAXN];
int Top;
void Link(int u,int v,int w,int ty)
{
edge[Top].ty = ty;
edge[Top].v = v;
edge[Top].w = w;
edge[Top].next = head[u];
head[u] = Top++;
}
int ans[1010];
int w[1010][1010];
int H[1010];
struct Q
{
int v,g,h,f;
bool operator < (const Q &a) const
{
return a.f < f;
}
};
void Init_H(int t)
{
Q s,f;
s.f = 0;
s.v = t;
memset(H,-1,sizeof(H));
H[t] = 0;
priority_queue<Q> q;
q.push(s);
while(q.empty() == false)
{
f = q.top();
q.pop();
H[f.v] = (H[f.v] == -1 ? f.f : H[f.v]);
for(int p = head[f.v]; p != -1; p = edge[p].next)
{
if(edge[p].ty == 2)
{
if(H[edge[p].v] == -1)
{
s.v = edge[p].v;
s.f = f.f + edge[p].w;
q.push(s);
}
}
}
}
}
void bfs(int h,int e,int k)
{
Q f,s;
priority_queue<Q> q;
f.g = 0;
f.h = H[h];
f.f = f.h + f.g;
f.v = h;
q.push(f);
while(q.empty() == false)
{
f = q.top();
q.pop();
if(f.g != 0)
{
w[f.v][++ans[f.v]] = f.g;
if(f.v == e && ans[f.v] == k)
return ;
}
for(int p = head[f.v]; p != -1; p = edge[p].next)
{
if(edge[p].ty == 1)
{
s.v = edge[p].v;
s.h = H[edge[p].v];
s.g = f.g + edge[p].w;
s.f = s.h + s.g;
q.push(s);
}
}
}
}
int main()
{
int n,m;
int u,v,ww,i;
while(scanf("%d %d",&n,&m) != EOF)
{
memset(head,-1,sizeof(head));
Top = 0;
for(i = 0;i < m; ++i)
{
scanf("%d %d %d",&u,&v,&ww);
Link(u,v,ww,1);
Link(v,u,ww,2);
}
int s,t,k;
scanf("%d %d %d",&s,&t,&k);
Init_H(t);
memset(ans,0,sizeof(ans));
bfs(s,t,k);
if(ans[t] < k)
{
printf("-1\n");
}
else
{
printf("%d\n",w[t][k]);
}
}
return 0;
}