问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

set aside set down set off

发布网友 发布时间:2022-04-11 00:24

我来回答

2个回答

懂视网 时间:2022-04-11 04:46

USACO的快乐农场题目
技术图片
题目大意
求结点1到n的严格次次短路径。

因为不久前刚刚看过了最短路计数这道题目,所以就想在求最短路的时候,用dis数组记录最短路和次短路,然后就愉快的打完了代码,过了样例,然后50……
技术图片

下面是50分代码

#include <bits/stdc++.h>
#define id tmp.second
#define di tmp.first
using namespace std;
typedef pair<int, int> PI;
const int M = 300500;
int n, r, head[M], tot, dis[M][2], vis[M];
struct EDGE{
int v, w, nxt;
}e[M];
priority_queue<PI, vector<PI>, greater<PI> > q;
PI tmp;

void add(int x, int y, int z)
{
e[++tot].v = y, e[tot].nxt = head[x], e[tot].w = z, head[x] = tot;
}

void Dijkstra()
{
memset(dis, 0x4f, sizeof(dis));
dis[1][0] = dis[1][1] = 0;
q.push(make_pair(0, 1));
while (!q.empty())
{
tmp = q.top(), q.pop();
if (vis[id]) continue;
vis[id] = 1;
for (int i = head[id]; i; i = e[i].nxt)
{
if (dis[e[i].v][0] > di + e[i].w)
{
dis[e[i].v][1] = dis[e[i].v][0], dis[e[i].v][0] = di + e[i].w;
if (!vis[e[i].v]) q.push(make_pair(dis[e[i].v][0], e[i].v));
}
else if (dis[e[i].v][1] > di + e[i].w) dis[e[i].v][1] = di + e[i].w;
}
}
}

int main()
{
int x, y, z;
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n >> r;
for (int i = 1; i <= r; ++i) cin >> x >> y >> z, add(x, y, z), add(y, x, z);
Dijkstra();
printf("%d", dis[n][1]);
return 0;
}

然后,我重新想了想我在求最短路的时候的判断,发现50这个样子写,最小值可能会覆盖次小值,因为我只判断了一遍的范围,没有限制次小值严格小于最小值。而且题目要求一条路可以重复走多次,所以我增加了每个点可以经过的次数。
判断部分就成了这个样子

for (int i = head[id]; i; i = e[i].nxt)
{
if (dis[e[i].v][0] > di + e[i].w)
{
dis[e[i].v][1] = dis[e[i].v][0], dis[e[i].v][0] = di + e[i].w;
if (dis[e[i].v][1] > dis[id][1] + e[i].w && dis[e[i].v][0] < dis[id][1] + e[i].w)
dis[e[i].v][1] = dis[id][1] + e[i].w;
if (vis[e[i].v] < 2) q.push(make_pair(dis[e[i].v][0], e[i].v));
}
else
if (dis[e[i].v][1] > di + e[i].w && dis[e[i].v][0] < di + e[i].w)
{
dis[e[i].v][1] = di + e[i].w;
q.push(make_pair(dis[e[i].v][0], e[i].v));
}
else
if (dis[e[i].v][1] > dis[id][1] + e[i].w && dis[e[i].v][0] < dis[id][1] + e[i].w)
dis[e[i].v][1] = dis[id][1] + e[i].w;
}

这样就过了90分!
然后下载了错误数据,发现还是错在了一条边可以走多次的问题上。因为走多次的话,第一个点的次短路就不一定是0了,所以我把初始化只改成了初始化1号点的最短路。这样就过了这个题。
下面是AC代码

#include <bits/stdc++.h>
#define id tmp.second
#define di tmp.first
using namespace std;
typedef pair<int, int> PI;
const int M = 300500;
int n, r, head[M], tot, dis[M][2], vis[M];
struct EDGE{
int v, w, nxt;
}e[M];
priority_queue<PI, vector<PI>, greater<PI> > q;
PI tmp;

void add(int x, int y, int z)
{
e[++tot].v = y, e[tot].nxt = head[x], e[tot].w = z, head[x] = tot;
}

void Dijkstra()
{
memset(dis, 0x4f, sizeof(dis));
dis[1][0] = 0;
q.push(make_pair(0, 1));
while (!q.empty())
{
tmp = q.top(), q.pop();
if (vis[id] == 2) continue;
++vis[id];
for (int i = head[id]; i; i = e[i].nxt)
{
if (dis[e[i].v][0] > di + e[i].w)
{
dis[e[i].v][1] = dis[e[i].v][0], dis[e[i].v][0] = di + e[i].w;
if (dis[e[i].v][1] > dis[id][1] + e[i].w && dis[e[i].v][0] < dis[id][1] + e[i].w)
dis[e[i].v][1] = dis[id][1] + e[i].w;
if (vis[e[i].v] < 2) q.push(make_pair(dis[e[i].v][0], e[i].v));
}
else
if (dis[e[i].v][1] > di + e[i].w && dis[e[i].v][0] < di + e[i].w)
{
dis[e[i].v][1] = di + e[i].w;
if (vis[e[i].v] < 2) q.push(make_pair(dis[e[i].v][0], e[i].v));
}
else
if (dis[e[i].v][1] > dis[id][1] + e[i].w && dis[e[i].v][0] < dis[id][1] + e[i].w)
dis[e[i].v][1] = dis[id][1] + e[i].w;
}
}
}

int main()
{
int x, y, z;
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n >> r;
for (int i = 1; i <= r; ++i) cin >> x >> y >> z, add(x, y, z), add(y, x, z);
Dijkstra();
printf("%d", dis[n][1]);
return 0;
}

技术图片

Roadblocks题解

标签:限制   size   ace   初始   cond   printf   code   ==   ble   

热心网友 时间:2022-04-11 01:54

set aside 把…放到一边;省出;暂时不考虑
She tries to set aside some money every month.
set down 记下,写下;制定,规定
The standards were set down by the governing body.
set off 出发,动身
We set off for London just after ten.
set up 建立,设置
The police set up roadblocks.
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
步步高学习机@iboxH2 H2学习机的屏幕大小? 6-7万左右纯电 女生想买台便宜的小车在城市代步,有什么好推荐?电动车最好? 河南德盛智能环保科技有限公司怎么样? 深圳市德盛铭电科技有限公司怎么样? pvc防水门生产厂家哪个好呢? 晋江市德顺陶瓷建材有限公司简介 酒店家具厂家 梨子酿酒最简单的方法 mac删除百度的阅读列表 如何彻底清空阅读列表,Mac软件与游戏 怎么删除阅读列表 手机百度阅读怎么删除多个文档? 如何删除百度文库中最近阅读 九江学院qq群吧 进了一个QQ群说是贴吧防骗交流群然后群主还做贷款是不是骗子啊? 怎么在百度贴吧发帖推广自己的 QQ群 群贴吧是什么意思 请问现在的百度贴吧为什么不让发QQ群?这有什么不好的吗? 百度贴吧能叫人加qq群吗 百度贴吧和qq群有什么区别 2013年7月计算机网络原理试题自考试题答案! 急求2011年4月、7月 自考计算机网络原理 真题 及答案! 谁有7月份自考计算机网络原理和概率论与数理统计的题透点给我啊?急急急!!! 全国2013年4月自学考试计算机网络原理试题求答案 大地车险和平安车险哪个好? 魂丢了怎么找回 现在平安交通意外险和大地的保险比起来是哪种更好呢 拼多多砍价里有直接点的怎么点了会一甩一甩的不出来的? 如何取消百度阅读 烤箱烤盘23升的有什么作用? 深圳市瑞林投资咨询有限公司怎么样? 格兰仕23升电烤箱KWS1523-307/1LP 好用吗? 风犬少年的天空朱玮娇和马田在一起了吗? 家用烤箱多大的合适,我就买来做一下蛋糕。 怎样把15MB的视频发的微信朋友圈,视频压缩之后很不清晰 风犬少年的天空安然最后和谁在一起 充电宝忘记还六天扣多少钱 23升烤箱要买几寸蛋糕模具? 谁有科盛23升电烤箱说明书,型号是K201R whistle是什么意思 微信动态表情睡觉晚安 WHISTLE是什么意思,怎么读 弱弱向英语大神请教whistle怎么读 哨子的英文怎么读 最肉麻的情话是什么?(黄的都死边点) 哨子的英语翻译 哨子用英语怎么说 英语的吹哨怎么说 怎样让微信里打字时出现特殊表情比如眼睛睡觉之类的