#include <iostream>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN = 1010;
int n, m, x, ct;
int g[MAXN][MAXN];
int gr[MAXN][MAXN];
int dist[MAXN];
int vis[MAXN];
struct node {
int id;
int fi;
int gi;
friend bool operator<(node a,node b){
if(a.gi==b.gi)
return a.fi>b.fi;
return a.gi>b.gi;
}
}s[2000000];
int init(){
memset(dist, 0x3f, sizeof dist);
memset(vis , 1 ,sizeof vis);
dist[n-1]=0;
for(int i=0;i<n;i++)
{
int k=n;
for(int j=0;j<n;j++)
if(vis[j]&&dist[j]<dist[k])
k=j;
if(k==n)
break;
vis[k]=0;
for(int j=0;j<n;j++)
if(vis[j]&&dist[k]+gr[k][j]<dist[j])
dist[j]=dist[k]+gr[k][j];
}
return 1;
}
int solve(){
if(dist[0]==INF)
return -1;
ct=0;
s[ct].id=0;
s[ct].fi=0;
s[ct++].gi=dist[0];
int cnt=0;
while(ct){
int id=s[0].id;
int fi=s[0].fi;
if(id==n-1)
cnt++;
if(cnt==x)
return fi;
pop_heap(s,s+ct);
ct--;
for(int j=0;j<n;j++)
{
if(g[id][j]<INF){
s[ct].id=j;
s[ct].fi=fi+g[id][j];
ct++;
push_heap(s,s+ct);
}
}
}
return -1;
}
int main() {
while (cin >> n >> m >> x) {
memset(g, 0x3f, sizeof(g));
memset(gr, 0x3f, sizeof(gr));
for (int i = 0; i < n; i++) {
int p, q, r;
cin >> p >> q >> r;
p--;
q--;
g[p][q] = g[p][q] <= r ? g[p][q] : r;
gr[q][p] = gr[q][p] <= r ? gr[q][p] : r;
}
init();
cout << solve() << endl;
}
return 0;
}
ACM模版题----第k短路
猜你喜欢
转载自blog.csdn.net/qq_41421433/article/details/83385234
今日推荐
周排行