任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=2763
2763: [JLOI2011]飞行路线
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 4928 Solved: 1938
[Submit][Status][Discuss]
Description
Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司。该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并且航线有一定的价格。Alice和Bob现在要从一个城市沿着航线到达另一个城市,途中可以进行转机。航空公司对他们这次旅行也推出优惠,他们可以免费在最多k种航线上搭乘飞机。那么Alice和Bob这次出行最少花费多少?
Input
数据的第一行有三个整数,n,m,k,分别表示城市数,航线数和免费乘坐次数。
第二行有两个整数,s,t,分别表示他们出行的起点城市编号和终点城市编号。(0<=s,t<n)
接下来有m行,每行三个整数,a,b,c,表示存在一种航线,能从城市a到达城市b,或从城市b到达城市a,价格为c。(0<=a,b<n,a与b不相等,0<=c<=1000)
Output
只有一行,包含一个整数,为最少花费。
Sample Input
5 6 1
0 4
0 1 5
1 2 5
2 3 5
3 4 5
2 3 3
0 2 100
0 4
0 1 5
1 2 5
2 3 5
3 4 5
2 3 3
0 2 100
Sample Output
8
HINT
对于30%的数据,2<=n<=50,1<=m<=300,k=0;
对于50%的数据,2<=n<=600,1<=m<=6000,0<=k<=1;
对于100%的数据,2<=n<=10000,1<=m<=50000,0<=k<=10.
Tip:模板用,用模板。
AC code:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <cstring>
#define INF 0x3f3f3f3f
#define LL long long int
using namespace std;
const int MAX_M = 5e4+;
const int MAX_N = 1e4+;
const int MAX_K = ;
struct date
{
int v, nxt, val;
}edge[MAX_M<<]; struct node
{
int u, k, w;
bool operator < (const node& a)const{
return w > a.w;
}
};
int N, M, K;
int head[MAX_N], cnt;
int dis[MAX_N][MAX_K];
bool vis[MAX_N][MAX_K];
priority_queue<node> Q; void init()
{
memset(head, -, sizeof(head));
cnt = ;
} void add(int from, int to, int weight)
{
edge[cnt].nxt = head[from];
edge[cnt].v = to;
edge[cnt].val = weight;
head[from] = cnt++;
} void Dijkstra(int s)
{
memset(dis, INF, sizeof(dis));
node tp; int v;
tp.u = s, tp.w = dis[s][] = , tp.k = ;
Q.push(tp);
vis[s][] = true;
while(!Q.empty()){
tp = Q.top();Q.pop();
vis[tp.u][tp.k] = false;
for(int i = head[tp.u]; i != -; i = edge[i].nxt){
v = edge[i].v;
if(dis[v][tp.k] > dis[tp.u][tp.k] + edge[i].val){
dis[v][tp.k] = dis[tp.u][tp.k] + edge[i].val;
if(!vis[v][tp.k]){
Q.push(node{v, tp.k, dis[v][tp.k]});
vis[v][tp.k] = true;
}
}
if(tp.k+ <= K){
if(dis[v][tp.k+] > dis[tp.u][tp.k]){
dis[v][tp.k+] = dis[tp.u][tp.k];
if(!vis[v][tp.k+]){
Q.push(node{v, tp.k+, dis[v][tp.k+]});
vis[v][tp.k+] = true;
}
}
}
}
}
} int main()
{
int u, v, w, st, ed;
scanf("%d%d%d", &N, &M, &K);
scanf("%d%d", &st, &ed);
init();
for(int i = ; i <= M; i++){
scanf("%d%d%d", &u, &v, &w);
add(u, v, w);
add(v, u, w);
}
Dijkstra(st);
printf("%d\n", dis[ed][K]);
return ;
}