10分,用的是并查集,跟某哩网站上学的,不知道哪里错了

P1525 [NOIP2010 提高组] 关押罪犯

@[张一2010](/user/1038838) 不用ans,if(a==b)直接输出在z[i].c 那个~~不务正业的~~市长只看影响最大的
by Tommyzheng11 @ 2024-04-16 17:52:13


f[a]=find(z[i].b+n),f[b]=find(z[i].a+n); 还有你的合并什么鬼······貌似越界了
by Tommyzheng11 @ 2024-04-16 17:53:26


你要做的是把敌人的敌人和自己放在一个监狱 不这样的话,因为每个犯人的敌人都是边处理边统计的且只有两个监狱~~好少~~,所以会使前面影响力更大的发生,就算自己与敌人的敌人见有矛盾,也是还未统计的,会比较小
by Tommyzheng11 @ 2024-04-16 17:56:48


体锻完了吗?跑了几圈啊 ~~吹着空调真爽~~
by Tommyzheng11 @ 2024-04-16 17:57:47


@[Tommyzheng11](/user/680584) 我竟然 [AC](https://www.luogu.com.cn/record/156119102) 了。我初始化只到n,忘记*2了,你不会没理解我代码吧,这都没发现,XUN BI!!!
by 张一2010 @ 2024-04-17 17:29:41


XUN,不同方法
by Tommyzheng11 @ 2024-04-18 11:21:43


@[张一2010](/user/1038838) 我应该和你看的是一个作品,我的乘了2,也只有十分,还没找到错误 ```cpp #include <iostream> #include <cstring> #include <algorithm> #include <vector> #include <cmath> #include <unordered_map> #include <unordered_set> #include <map> #include <set> #include <queue> #include <stack> #include <deque> #include <functional> #include <climits> #define quickio ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); #define endl "\n" using namespace std; typedef long long ll; const int N = 2e4 + 5; const int M = 1e5 + 5; int n, m; int fa[N * 2]; int ans; struct zf { int a; int b; int c; bool operator<(struct zf t) { return c < t.c; } }zf[M]; int find(int son) { if (fa[son] == son) return son; return fa[son] = find(fa[son]); } int FindMin() { for (int i = 0; i < m; i++) { if (find(zf[i].a) == find(zf[i].b))//如果两个在同一集合------->已经分好两组了------->则他们之间的边权就是答案 { return zf[i].c; } else//如果两个不在同一集合,则分别列入对方的敌人集合 { fa[find(zf[i].a)] = find(zf[i].b + n); fa[find(zf[i].b)] = find(zf[i].a + n); } } return 0; } int main() { cin >> n >> m; for (int i = 0; i < m; i++) { cin >> zf[i].a >> zf[i].b >> zf[i].c; } sort(zf, zf + m);//排序所有边 for (int i = 1; i <= 2 * n; i++) { fa[i] = i;//i >= n的存的是敌人 } ans = FindMin(); cout << ans << endl; return 0; } ```
by ruanertanjing @ 2024-05-05 20:08:09


|