标签:sam 城市 这不 return sample continue dijkstra 有趣 free
“我要成为魔法少女!”
“那么,以灵魂为代价,你希望得到什么?”
“我要将有关魔法和奇迹的一切,封印于卡片之中??”
在这个愿望被实现以后的世界里,人们享受着魔法卡片(SpellCard,又名符
卡)带来的便捷。
现在,不需要立下契约也可以使用魔法了!你还不来试一试?
比如,我们在魔法百科全书(Encyclopedia of Spells)里用“freeze”作为关
键字来查询,会有很多有趣的结果。
例如,我们熟知的Cirno,她的冰冻魔法当然会有对应的 SpellCard 了。 当然,
更加令人惊讶的是,居然有冻结时间的魔法,Cirno 的冻青蛙比起这些来真是小
巫见大巫了。
这说明之前的世界中有很多魔法少女曾许下控制时间的愿望,比如 Akemi
Homura、Sakuya Izayoi、??
当然,在本题中我们并不是要来研究历史的,而是研究魔法的应用。
我们考虑最简单的旅行问题吧: 现在这个大陆上有 N 个城市,M 条双向的
道路。城市编号为 1~N,我们在 1 号城市,需要到 N 号城市,怎样才能最快地
到达呢?
这不就是最短路问题吗?我们都知道可以用 Dijkstra、Bellman-Ford、
Floyd-Warshall等算法来解决。
现在,我们一共有 K 张可以使时间变慢 50%的 SpellCard,也就是说,在通
过某条路径时,我们可以选择使用一张卡片,这样,我们通过这一条道路的时间
就可以减少到原先的一半。需要注意的是:
给定以上的信息,你的任务是:求出在可以使用这不超过 K 张时间减速的
SpellCard 之情形下,从城市1 到城市N最少需要多长时间。
第一行包含三个整数:N、M、K。
接下来 M 行,每行包含三个整数:Ai、Bi、Timei,表示存在一条 Ai与 Bi之
间的双向道路,在不使用 SpellCard 之前提下,通过它需要 Timei的时间。
输出一个整数,表示从1 号城市到 N号城市的最小用时。
4 4 1
1 2 4
4 2 6
1 3 8
3 4 8
7
【样例1 解释】
在不使用 SpellCard 时,最短路为 1à2à4,总时间为 10。现在我们可
以使用 1 次 SpellCard,那么我们将通过 2à4 这条道路的时间减半,此时总
时间为7。
对于100%的数据:1 ≤ K ≤ N ≤ 50,M ≤ 1000。
1≤ Ai,Bi ≤ N,2 ≤ Timei ≤ 2000。
为保证答案为整数,保证所有的 Timei均为偶数。
所有数据中的无向图保证无自环、重边,且是连通的。
练习打板而已qwq。。。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 55;
struct lpl{
int to, step, dis;
inline bool operator < (const lpl &A)const{
return dis > A.dis;
}
};
int n, m, k;
int dis[55][55];
bool vis[55][55];
vector<lpl> point[maxn];
priority_queue<lpl> q;
inline int dijkstra(int s, int t){
lpl now, qwe;
memset(dis, 0x3f, sizeof(dis));
q.push((lpl){1, 0, 0}); dis[s][0] = 0;
while(!q.empty()){
now = q.top(); q.pop();
if(now.to == t && now.step == k) return dis[t][k];
if(vis[now.to][now.step]) continue;
vis[now.to][now.step] = true;
for(int i = point[now.to].size() - 1; i >= 0; --i){
qwe = point[now.to][i];
if(dis[qwe.to][now.step] > dis[now.to][now.step] + qwe.dis){
dis[qwe.to][now.step] = dis[now.to][now.step] + qwe.dis;
q.push((lpl){qwe.to, now.step, dis[qwe.to][now.step]});
}
if(now.step == k) continue;
if(dis[qwe.to][now.step + 1] > dis[now.to][now.step] + qwe.dis / 2){
dis[qwe.to][now.step + 1] = dis[now.to][now.step] + qwe.dis / 2;
q.push((lpl){qwe.to, now.step + 1, dis[qwe.to][now.step + 1]});
}
}
if(now.step != k){
if(dis[now.to][now.step + 1] > dis[now.to][now.step]){
dis[now.to][now.step + 1] = dis[now.to][now.step];
q.push((lpl){now.to, now.step + 1, dis[now.to][now.step]});
}
}
}
return dis[t][k];
}
int main()
{
//freopen("lpl.in", "r", stdin);
lpl lin;
scanf("%d%d%d", &n, &m, &k);
for(int a, b, i = 1; i <= m; ++i){
scanf("%d%d%d", &a, &b, &lin.dis);
lin.to = b; point[a].push_back(lin);
lin.to = a; point[b].push_back(lin);
}
cout << dijkstra(1, n);
return 0;
}
标签:sam 城市 这不 return sample continue dijkstra 有趣 free
原文地址:https://www.cnblogs.com/LLppdd/p/9880298.html