鱼C论坛

 找回密码
 立即注册
查看: 1007|回复: 9

[已解决]求助luogu P1955!!!

[复制链接]
发表于 2023-7-27 19:54:01 | 显示全部楼层 |阅读模式

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

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

x
我的代码:

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

  3. struct node {
  4.     int x, y, z;
  5. };

  6. int t, n, e, c, d, f[1000010], b[3000030], tot, fl, ass, k1, k2;
  7. node a[1000010];

  8. int find(int x) {
  9.     if (f[x] == x) return x;
  10.     return f[x] = find(f[x]);
  11. }

  12. inline void init(int g){
  13.     for(int i = 1; i <= g; i++) f[i] = i;
  14. }

  15. bool cmp(node a, node b) {
  16.     return a.z > b.z;
  17. }

  18. int main() {
  19.     cin >> t;
  20.     while (t--) {
  21.         cin >> n;
  22.         memset(b, 0, sizeof(b));
  23.         memset(f, 0, sizeof(f));
  24.         memset(a, 0, sizeof(a));
  25.         tot = -1;
  26.         fl = 1;
  27.         for (int i = 1; i <= n; i++) {
  28.             cin >> a[i].x >> a[i].y >> a[i].z;
  29.             b[++tot] = a[i].x;
  30.             b[++tot] = a[i].y;
  31.         }
  32.         sort(b, b + tot);
  33.         ass = unique(b, b + tot) - b;
  34.         for (int i = 1; i <= n; i++) {
  35.             a[i].x = lower_bound(b, b + ass, a[i].x) - b;
  36.             a[i].y = lower_bound(b, b + ass, a[i].y) - b;
  37.         }
  38.         init(ass);
  39.         sort(a + 1, a + n + 1, cmp);
  40.         for (int i = 1; i <= n; i++) {
  41.             k1 = find(a[i].x);
  42.             k2 = find(a[i].y);
  43.             if (a[i].z) {
  44.                 f[k1] = k2;
  45.             } else if (k1 == k1) {
  46.                 cout << "NO" << endl;
  47.                 fl = 0;
  48.                 break;
  49.             }
  50.         }
  51.         if (fl) cout << "YES" << endl;
  52.     }

  53.     return 0;
  54. }
复制代码


和第一个题解差不多()但是我的为什么过不了?

妈呀,地球要爆炸啦!!怎么办啊啊啊啊啊啊啊啊啊啊啊啊啊啊




最佳答案
2023-7-27 19:54:32
问题分析:
根据您提供的代码,有几个问题可能导致程序无法通过评测:

1. 在使用find()函数时,判断条件错误:if (k1 == k1)应该改为if (k1 == k2)

2. 在最后输出结果时,需要在每次测试用例结束后输出换行符\n

解决方案:
请按照以下方式修改代码:
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. struct node {
  4.     int x, y, z;
  5. };
  6. int t, n, e, c, d, f[1000010], b[3000030], tot, fl, ass, k1, k2;
  7. node a[1000010];
  8. int find(int x) {
  9.     if (f[x] == x)
  10.         return x;
  11.     return f[x] = find(f[x]);
  12. }
  13. inline void init(int g) {
  14.     for (int i = 1; i <= g; i++)
  15.         f[i] = i;
  16. }
  17. bool cmp(node a, node b) {
  18.     return a.z > b.z;
  19. }
  20. int main() {
  21.     cin >> t;
  22.     while (t--) {
  23.         cin >> n;
  24.         memset(b, 0, sizeof(b));
  25.         memset(f, 0, sizeof(f));
  26.         memset(a, 0, sizeof(a));
  27.         tot = -1;
  28.         fl = 1;
  29.         
  30.         for (int i = 1; i <= n; i++) {
  31.             cin >> a[i].x >> a[i].y >> a[i].z;
  32.             b[++tot] = a[i].x;
  33.             b[++tot] = a[i].y;
  34.         }
  35.         
  36.         sort(b, b + tot);
  37.         ass = unique(b, b + tot) - b;
  38.         
  39.         for (int i = 1; i <= n; i++) {
  40.             a[i].x = lower_bound(b, b + ass, a[i].x) - b;
  41.             a[i].y = lower_bound(b, b + ass, a[i].y) - b;
  42.         }
  43.         
  44.         init(ass);
  45.         sort(a + 1, a + n + 1, cmp);
  46.         
  47.         for (int i = 1; i <= n; i++) {
  48.             k1 = find(a[i].x);
  49.             k2 = find(a[i].y);
  50.             
  51.             if (a[i].z) {
  52.                 f[k1] = k2;
  53.             } else if (k1 == k2) {
  54.                 cout << "NO" << endl;
  55.                 fl = 0;
  56.                 break;
  57.             }
  58.         }
  59.         
  60.         if (fl)
  61.             cout << "YES" << endl;
  62.     }
  63.    
  64.     return 0;
  65. }
复制代码

请尝试使用以上修改后的代码重新提交。如果问题仍然存在,请提供具体的错误提示信息,以便我能够更好地帮助您解决问题。

球一个最佳答案谢谢啦!这对我非常重要!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-7-27 19:54:32 | 显示全部楼层    本楼为最佳答案   
问题分析:
根据您提供的代码,有几个问题可能导致程序无法通过评测:

1. 在使用find()函数时,判断条件错误:if (k1 == k1)应该改为if (k1 == k2)

2. 在最后输出结果时,需要在每次测试用例结束后输出换行符\n

解决方案:
请按照以下方式修改代码:
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. struct node {
  4.     int x, y, z;
  5. };
  6. int t, n, e, c, d, f[1000010], b[3000030], tot, fl, ass, k1, k2;
  7. node a[1000010];
  8. int find(int x) {
  9.     if (f[x] == x)
  10.         return x;
  11.     return f[x] = find(f[x]);
  12. }
  13. inline void init(int g) {
  14.     for (int i = 1; i <= g; i++)
  15.         f[i] = i;
  16. }
  17. bool cmp(node a, node b) {
  18.     return a.z > b.z;
  19. }
  20. int main() {
  21.     cin >> t;
  22.     while (t--) {
  23.         cin >> n;
  24.         memset(b, 0, sizeof(b));
  25.         memset(f, 0, sizeof(f));
  26.         memset(a, 0, sizeof(a));
  27.         tot = -1;
  28.         fl = 1;
  29.         
  30.         for (int i = 1; i <= n; i++) {
  31.             cin >> a[i].x >> a[i].y >> a[i].z;
  32.             b[++tot] = a[i].x;
  33.             b[++tot] = a[i].y;
  34.         }
  35.         
  36.         sort(b, b + tot);
  37.         ass = unique(b, b + tot) - b;
  38.         
  39.         for (int i = 1; i <= n; i++) {
  40.             a[i].x = lower_bound(b, b + ass, a[i].x) - b;
  41.             a[i].y = lower_bound(b, b + ass, a[i].y) - b;
  42.         }
  43.         
  44.         init(ass);
  45.         sort(a + 1, a + n + 1, cmp);
  46.         
  47.         for (int i = 1; i <= n; i++) {
  48.             k1 = find(a[i].x);
  49.             k2 = find(a[i].y);
  50.             
  51.             if (a[i].z) {
  52.                 f[k1] = k2;
  53.             } else if (k1 == k2) {
  54.                 cout << "NO" << endl;
  55.                 fl = 0;
  56.                 break;
  57.             }
  58.         }
  59.         
  60.         if (fl)
  61.             cout << "YES" << endl;
  62.     }
  63.    
  64.     return 0;
  65. }
复制代码

请尝试使用以上修改后的代码重新提交。如果问题仍然存在,请提供具体的错误提示信息,以便我能够更好地帮助您解决问题。

球一个最佳答案谢谢啦!这对我非常重要!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-27 19:54:36 | 显示全部楼层
你好!看起来你在寻求帮助解决luogu P1955的问题。让我们来看一下你的代码,找出问题所在并进行解释。

首先,我们来分析代码中可能存在的问题:

1. 初始化数组:在每次测试案例循环开始前,你使用 memset 函数对数组 b 、 f 和 a 进行了初始化。但是,在这种情况下,应该使用 memset 函数对整个数组进行初始化是不安全的,因为结构体 node 中含有int类型的变量。正确的做法是手动对数组进行遍历,并逐个元素初始化为0。

2. 结构体排序:你使用 sort 函数对结构体数组 a 进行排序,但这里需要注意,结构体排序的比较函数是 bool cmp(node a, node b) ,按照 a.z > b.z 进行排序。这是按照节点的 z 成员进行降序排序。在题目描述中没有明确规定 z 的含义,所以请确保你理解了题目并正确使用排序函数。

3. 并查集:你尝试使用并查集来解决问题,但是在合并两个集合时,你的代码存在一处逻辑错误。在以下代码中:

  1. if (a[ i].z) {
  2.     f[k1] = k2;
  3. } else if (k1 == k1) {
  4.     cout << "NO" << endl;
  5.     fl = 0;
  6.     break;
  7. }
复制代码


应该是  else if (k1 == k2)  而不是  else if (k1 == k1) 。这是因为你希望在条件判断中检查是否需要合并两个集合,而不是判断同一个元素是否等于自身,这个条件实际上永远为真。

现在我们来修正你的代码,将上述问题进行改正:

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

  3. struct node {
  4.     int x, y, z;
  5. };

  6. int t, n, e, c, d, f[1000010], b[3000030], tot, fl, ass, k1, k2;
  7. node a[1000010];

  8. int find(int x) {
  9.     if (f[x] == x) return x;
  10.     return f[x] = find(f[x]);
  11. }

  12. inline void init(int g){
  13.     for(int i = 1; i <= g; i++) f[ i] = i;
  14. }

  15. bool cmp(node a, node b) {
  16.     return a.z > b.z;
  17. }

  18. int main() {
  19.     cin >> t;
  20.     while (t--) {
  21.         cin >> n;
  22.         memset(b, 0, sizeof(b));
  23.         tot = -1;
  24.         fl = 1;
  25.         for (int i = 1; i <= n; i++) {
  26.             cin >> a[ i].x >> a[ i].y >> a[ i].z;
  27.             b[++tot] = a[ i].x;
  28.             b[++tot] = a[ i].y;
  29.         }
  30.         sort(b, b + tot);
  31.         ass = unique(b, b + tot) - b;
  32.         for (int i = 1; i <= n; i++) {
  33.             a[ i].x = lower_bound(b, b + ass, a[ i].x) - b;
  34.             a[ i].y = lower_bound(b, b + ass, a[ i].y) - b;
  35.         }
  36.         init(ass);
  37.         sort(a + 1, a + n + 1, cmp);
  38.         for (int i = 1; i <= n; i++) {
  39.             k1 = find(a[ i].x);
  40.             k2 = find(a[ i].y);
  41.             if (a[ i].z) {
  42.                 f[k1] = k2;
  43.             } else if (k1 == k2) {
  44.                 cout << "NO" << endl;
  45.                 fl = 0;
  46.                 break;
  47.             }
  48.         }
  49.         if (fl) cout << "YES" << endl;
  50.     }

  51.     return 0;
  52. }
复制代码


修正后的代码应该可以正常运行。希望这个解释对你有帮助,如果你还有其他问题,欢迎继续提问!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-27 19:54:54 | 显示全部楼层
我了解你希望得到关于 luogu P1955 题目的帮助。不过,由于我是一个 AI 语言模型,并不能直接运行你的代码,更不能访问外部资源。但我可以帮助你理解代码并指出可能的问题。

根据你提供的代码,你正在尝试解决一个图的连通性问题。以下是我对你的代码进行分析的结果:

1. 给定的结构体 node 用于表示边的信息,其中 xy 是边的两个顶点,z 是边的权重。
2. find 函数使用了路径压缩的并查集算法来查找根节点,以判断两个顶点是否处于同一个连通分量中。
3. init 函数用于初始化并查集数组 f
4. cmp 函数用于在排序时按照边权重从大到小进行比较。
5. 主函数根据输入的测试用例,依次处理每个测试用例。
6. 在每个测试用例中,首先读取 n 的值,然后读取 n 条边的信息,并根据顶点的编号构建离散化的数组 b
7. 然后,对输入的边进行排序,并使用并查集进行连通判断。
8. 如果所有的边都能正确连通,则输出 "YES",否则输出 "NO"。

根据你的描述,你的代码与第一个题解相似。然而,你可能遇到以下问题:

1. 初始化并查集时,你使用了 memset(f, 0, sizeof(f))f 数组全部置为 0。但是在并查集中,初始化时每个元素应该指向自己,即 f[ i] = i
2. 在判断是否输出 "NO" 的条件中,你错误地写成了 k1 == k1,应该是 k1 == k2
3. 在构建离散化数组 b 时,你需要将 ass 的大小改为 ass + 1,以便正确覆盖 b[ass] 位置的元素。

我建议你尝试对代码进行一些修正并重新运行,如下所示:

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

  3. struct node {
  4.     int x, y, z;
  5. };

  6. int t, n, e, c, d, f[1000010], b[3000030], tot, fl, ass, k1, k2;
  7. node a[1000010];

  8. int find(int x) {
  9.     if (f[x] == x)
  10.         return x;
  11.     return f[x] = find(f[x]);
  12. }

  13. inline void init(int g) {
  14.     for (int i = 1; i <= g; i++)
  15.         f[ i] = i;
  16. }

  17. bool cmp(node a, node b) {
  18.     return a.z > b.z;
  19. }

  20. int main() {
  21.     cin >> t;
  22.     while (t--) {
  23.         cin >> n;
  24.         memset(b, 0, sizeof(b));
  25.         init(ass);
  26.         tot = -1;
  27.         fl = 1;

  28.         for (int i = 1; i <= n; i++) {
  29.             cin >> a[ i].x >> a[ i].y >> a[ i].z;
  30.             b[++tot] = a[ i].x;
  31.             b[++tot] = a[ i].y;
  32.         }

  33.         sort(b, b + tot);
  34.         ass = unique(b, b + tot) - b;

  35.         for (int i = 1; i <= n; i++) {
  36.             a[ i].x = lower_bound(b, b + ass, a[ i].x) - b;
  37.             a[ i].y = lower_bound(b, b + ass, a[ i].y) - b;
  38.         }

  39.         init(ass);
  40.         sort(a + 1, a + n + 1, cmp);

  41.         for (int i = 1; i <= n; i++) {
  42.             k1 = find(a[ i].x);
  43.             k2 = find(a[ i].y);
  44.             if (a[ i].z) {
  45.                 f[k1] = k2;
  46.             } else if (k1 == k2) {
  47.                 cout << "NO" << endl;
  48.                 fl = 0;
  49.                 break;
  50.             }
  51.         }

  52.         if (fl)
  53.             cout << "YES" << endl;
  54.     }

  55.     return 0;
  56. }
复制代码


希望这些修改能够帮助你解决问题。如果还有其他问题,请随时向我提问。祝你好运!
如果问题已经解决,请设置最佳答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-27 19:56:43 | 显示全部楼层
Mike_python小 发表于 2023-7-27 19:54
问题分析:
根据您提供的代码,有几个问题可能导致程序无法通过评测:

艹,这......谢谢chatqpt
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-27 19:57:16 | 显示全部楼层
陶远航 发表于 2023-7-27 19:54
我了解你希望得到关于 luogu P1955 题目的帮助。不过,由于我是一个 AI 语言模型,并不能直接运行你的代码 ...

来晚啦~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-27 19:57:51 | 显示全部楼层
isdkz 发表于 2023-7-27 19:54
你好!看起来你在寻求帮助解决luogu P1955的问题。让我们来看一下你的代码,找出问题所在并进行解释。

...

来晚啦~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-27 20:44:45 | 显示全部楼层
Ewan-Ahiouy 发表于 2023-7-27 19:56
艹,这......谢谢chatqpt

说明这道题很简单。连gpt3.5都行

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

使用道具 举报

 楼主| 发表于 2023-7-27 20:47:06 | 显示全部楼层
sfqxx 发表于 2023-7-27 20:44
说明这道题很简单。连gpt3.5都行

你答个试试
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-27 20:49:01 | 显示全部楼层

啊这,一道绿题,gpt3.5超常发挥还是需要错误代码帮助
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-10 02:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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