P4568 [JLOI2011]飞行路线
#include <bits/stdc++.h>
using namespace std;
int n,m,k;
int s,t;
struct node
{
int v,d;
};
struct no1
{
int v,d,k;
bool operator < (const no1 &y)const
{
if(d == y.d)
{
return k > y.k;
}
return d > y.d;
}
};
vector <node> e[10000];
int dis[10000][11];
int vis[10000][11];
int ans;
void dij(int x)
{
priority_queue<no1> q;
q.push(no1{x,0,0});
dis[x][0] = 0;
while(!q.empty())
{
no1 v = q.top();
q.pop();
if(vis[v.v][v.k])continue;
if(v.v == t)
{
ans = v.d;
break;
}
vis[v.v][v.k] = 1;
int maxx = e[v.v].size();
for (int i = 0; i < maxx; i++)
{
int u = e[v.v][i].v;
int d = e[v.v][i].d;
if(vis[u][v.k] == 0 && dis[u][v.k] > dis[v.v][v.k] + d)//不免费
{
dis[u][v.k] = dis[v.v][v.k] + d;
q.push(no1{u,dis[u][v.k],v.k});
}
if(v.k < k && vis[u][v.k + 1] == 0 && dis[u][v.k + 1] > dis[v.v][v.k])//免费
{
dis[u][v.k + 1] = dis[v.v][v.k];
q.push(no1{u,dis[u][v.k + 1],v.k + 1});
}
}
}
}
int main()
{
int a,b,c;
cin >> n >> m >> k;
cin >> s >> t;
for (int i = 1; i <= m; i++)
{
cin >> a >> b >> c;
e[a].push_back(node{b,c});
e[b].push_back(node{a,c});
}
memset(dis,0x3f,sizeof(dis));
dij(s);
cout << ans;
return 0;
}
分层图最短路板题
浙公网安备 33010602011771号