鱼C论坛

 找回密码
 立即注册
查看: 2944|回复: 18

[已解决]请教各位大佬,为什么我这道题总是WA,是那个细节没有注意到吗?

[复制链接]
发表于 2022-11-20 19:43:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 zhangjinxuan 于 2022-11-20 19:43 编辑

原题链接:
https://atcoder.jp/contests/abc277/tasks/abc277_e

原题翻译:
来源于:https://www.luogu.com.cn/problem/AT_abc277_e

题面

给定一张 n 个点 m 条边的无向图,每条边有一个权值 w (0 <= w <= 1), w = 0 表示无法通过,反之表示可通过

其中,有 k 个点上面有按钮,按下按钮,全部路的边权取反,即:w = 0 变成 1,w = 1 变成 0

你现在位于 1 号点,每次,你可以做两件事:
1. 移动到相邻的一个点上,前提是边可以通行;
2. 按按钮,前提是所在的点上有按钮


输入格式

第一行一个整数 n, m, k

接下来 m 行,每行三个数 u, v, w, 表示一条链接 u 与 v 的边,权值为 w

最后一行 k 个数,表示按钮的位置


输出格式

一个整数,表示最少移动步数,若无法到达,输出 -1


输入样例

  1. 5 5 2
  2. 1 3 0
  3. 2 3 1
  4. 5 4 1
  5. 2 1 1
  6. 1 4 0
  7. 3 4
复制代码



输出样例

  1. 5
复制代码



我的代码


  1. #include <bits/stdc++.h>
  2. using namespace std;

  3. struct Info {
  4.         int x;
  5.         bool y;
  6. } q[501001];

  7. int n, m, k, u, v, s[200001], front, rear, step[200001][2];
  8. bool in_s[200001];
  9. bool a;
  10. vector<Info> edges[200001];

  11. void bfs() {
  12.         memset(step, 255, sizeof(step));
  13.         rear = front = 1;
  14.         q[rear] = {1, 0};
  15.         step[1][0] = 0;
  16.         while (rear + 1 != front) {
  17.                 Info f = q[front++];
  18.                 //printf("%d %d : ", f.x, f.y);
  19.                 if (f.x == n) {
  20.                         if (step[f.x][0] == -1) printf("%d", step[f.x][1]);
  21.                         else if (step[f.x][1] == -1) printf("%d", step[f.x][0]);
  22.                         else printf("%d", min(step[f.x][0], step[f.y][1]));
  23.                         return;
  24.                 }
  25.                 for (Info i : edges[f.x]) {
  26.                                 if (((f.y == 1 && i.y == 0) || (f.y == 0 && i.y == 1)) && step[i.x][0] == -1) {
  27.                                         step[i.x][0] = step[f.x][f.y] + 1;
  28.                                         q[++rear] = {i.x, 0};
  29.                                         //printf("(OK)");
  30.                                 } else if (in_s[f.x] && step[i.x][1] == -1) {
  31.                                         step[i.x][1] = step[f.x][f.y] + 1;
  32.                                         q[++rear] = {i.x, 1};
  33.                                 }
  34.                 }
  35.         }
  36.         printf("-1");
  37. }

  38. int main() {
  39.         scanf("%d%d%d", &n, &m, &k);
  40.         for (int i = 1; i <= m; ++i) {
  41.                 scanf("%d%d%d", &u, &v, &a);
  42.                 edges[u].push_back({v, a});
  43.                 edges[v].push_back({u, a});
  44.         }
  45.         for (int i = 1; i <= k; ++i) {
  46.                 scanf("%d", &s[i]);
  47.                 in_s[s[i]] = 1;
  48.         }
  49.         bfs();
  50.     return 0;
  51. }
复制代码


不知道是思路错了还是细节错了,希望大佬给予解答
最佳答案
2022-11-22 09:10:34
zhangjinxuan 发表于 2022-11-22 09:10
不对啊,你一个 struct 怎么优先?

用pair+priorty_queue
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-11-21 08:44:33 | 显示全部楼层
@tommyyu @陈尚涵 @柿子饼同学 @xiaosi4081 你们会吗,希望解答,感谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-21 18:41:09 | 显示全部楼层
等我吃个饭先
不过我已经退役的说...
我是真的不理解为什么不用现成的 queue
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-21 19:16:06 | 显示全部楼层
柿子饼同学 发表于 2022-11-21 18:41
等我吃个饭先
不过我已经退役的说...
我是真的不理解为什么不用现成的 queue

我觉得效率《慢》,而且不灵活,不方便调试
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-21 20:02:10 | 显示全部楼层
zhangjinxuan 发表于 2022-11-21 19:16
我觉得效率《慢》,而且不灵活,不方便调试

好吧 ,  我只能说 , 我不会做...
如果我能去参加特长生考试 , 我就会继续学的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-21 20:03:21 | 显示全部楼层
柿子饼同学 发表于 2022-11-21 20:02
好吧 ,  我只能说 , 我不会做...
如果我能去参加特长生考试 , 我就会继续学的

啊,那算了,我问问老师
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-22 07:49:16 | 显示全部楼层
本帖最后由 xiaosi4081 于 2022-11-22 08:00 编辑
zhangjinxuan 发表于 2022-11-21 08:44
@tommyyu @陈尚涵 @柿子饼同学 @xiaosi4081 你们会吗,希望解答,感谢!


完了太难了

djkstra板子打的挺不错的

不过....假设用djkstra的话你用不用优先队列啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-22 07:55:04 | 显示全部楼层
xiaosi4081 发表于 2022-11-22 07:49
完了太难了

djkstra板子打的挺不错的

AT第五题,是很难,估计我的上限也就第四题了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-22 07:58:51 | 显示全部楼层
有人吗????
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-22 08:00:13 | 显示全部楼层
zhangjinxuan 发表于 2022-11-22 07:55
AT第五题,是很难,估计我的上限也就第四题了

优先队列可以试试
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-22 08:19:19 | 显示全部楼层
本帖最后由 zhangjinxuan 于 2022-11-22 08:20 编辑
xiaosi4081 发表于 2022-11-22 08:00
优先队列可以试试


优先队列??是 priority_queue 吗?这不是堆的实现吗???怎么个做法??
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-22 08:49:44 | 显示全部楼层
zhangjinxuan 发表于 2022-11-22 08:19
优先队列??是 priority_queue 吗?这不是堆的实现吗???怎么个做法??

就是把你那个队列搞成优先队列
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-22 08:57:40 | 显示全部楼层
xiaosi4081 发表于 2022-11-22 08:49
就是把你那个队列搞成优先队列

bfs的队列用优先队列?从来没见过!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-22 09:05:48 | 显示全部楼层
zhangjinxuan 发表于 2022-11-22 08:57
bfs的队列用优先队列?从来没见过!

不应该跑最短路吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-22 09:06:38 | 显示全部楼层
xiaosi4081 发表于 2022-11-22 09:05
不应该跑最短路吗

那好吧,我逝世
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-22 09:10:03 | 显示全部楼层
xiaosi4081 发表于 2022-11-22 09:05
不应该跑最短路吗

不对啊,你一个 struct 怎么优先?
  1. #include <bits/stdc++.h>
  2. using namespace std;

  3. struct Info {
  4.         int x;
  5.         bool y;
  6. };
  7. priority_queue<Info> q;

  8. int n, m, k, u, v, s[200001], step[200001][2];
  9. bool in_s[200001];
  10. bool a;
  11. vector<Info> edges[200001];

  12. void bfs() {
  13.         memset(step, 255, sizeof(step));
  14.         q.push({1, 0});
  15.         step[1][0] = 0;
  16.         while (!q.empty()) {
  17.                 Info f = q.top();
  18.                 q.pop();
  19.                 if (f.x == n) {
  20.                         if (step[f.x][0] == -1) printf("%d", step[f.x][1]);
  21.                         else if (step[f.x][1] == -1) printf("%d", step[f.x][0]);
  22.                         else printf("%d", min(step[f.x][0], step[f.y][1]));
  23.                         return;
  24.                 }
  25.                 for (Info i : edges[f.x]) {
  26.                         //printf("(%d, %d), ", i.x, i.y);
  27.                                 if (((f.y == 1 && i.y == 0) || (f.y == 0 && i.y == 1)) && step[i.x][0] == -1) {
  28.                                         step[i.x][0] = step[f.x][f.y] + 1;
  29.                                         q.push({i.x, 0});
  30.                                         //printf("(OK)");
  31.                                 } else if (in_s[f.x] && step[i.x][1] == -1) {
  32.                                         step[i.x][1] = step[f.x][f.y] + 1;
  33.                                         q.push({i.x, 1});
  34.                                         //printf("(ZOK");
  35.                                 }
  36.                 }
  37.                 //puts("");
  38.         }
  39.         printf("-1");
  40. }

  41. int main() {
  42.         scanf("%d%d%d", &n, &m, &k);
  43.         for (int i = 1; i <= m; ++i) {
  44.                 scanf("%d%d%d", &u, &v, &a);
  45.                 edges[u].push_back({v, a});
  46.                 edges[v].push_back({u, a});
  47.         }
  48.         for (int i = 1; i <= k; ++i) {
  49.                 scanf("%d", &s[i]);
  50.                 in_s[s[i]] = 1;
  51.         }
  52.         bfs();
  53.     return 0;
  54. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-22 09:10:34 | 显示全部楼层    本楼为最佳答案   
zhangjinxuan 发表于 2022-11-22 09:10
不对啊,你一个 struct 怎么优先?

用pair+priorty_queue
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-22 09:13:25 | 显示全部楼层

好吧,逝世双关键字
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-22 09:57:37 | 显示全部楼层

我觉得就是某个细节错了,谁家的 BFS 用的是优先队列啊,我不信
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-23 04:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表