专栏文章
题解:P11644 【MX-X8-T3】「TAOI-3」地地爱打卡
P11644题解参与者 7已保存评论 8
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 8 条
- 当前快照
- 1 份
- 快照标识符
- @miqd8isu
- 此快照首次捕获于
- 2025/12/04 02:54 3 个月前
- 此快照最后确认于
- 2025/12/04 02:54 3 个月前
分析
结论:如果 和路径长度的奇偶性相同或是在 所在联通快中含有一个奇环则合法。
证明:因为可以在一条路上来回走,所以可以将快乐值凑到 ,由于一个数异或偶数个 还是这个数本身,所以最终的能量值也可以凑到 。又因为奇数长度的环可以改变路径长度的奇偶性,所以如果图中有奇环那么一定合法。
做两遍 dfs 即可,第一遍 dfs 判断连通性,第二遍 dfs 找奇环,注意特判孤立点。
CPP#include <bits/stdc++.h>
using namespace std;
vector<int>g[200005];
int shu[200005], vis[200005], cnt;
int vi[200005], dis[200005], ji[200005];
void dfs(int x) {
if (vis[x])
return;
vis[x] = 1;
for (int y : g[x]) {
shu[y] = cnt;
dfs(y);
}
}
void df(int x, int fa) {
vi[x] = 1;
for (int y : g[x]) {
if (y == fa)
continue;
if (!vi[y])
dis[y] = dis[x] + 1, df(y, x);
else if (abs(dis[x] - dis[y]) % 2 == 0)
ji[shu[x]] = 1;
}
}
int main() {
int n, m, q;
cin >> n >> m >> q;
for (int i = 1; i <= m; i++) {
int x, y;
cin >> x >> y;
g[x].push_back(y);
g[y].push_back(x);
}
for (int i = 1; i <= n; i++)
if (!vis[i])
shu[i] = ++cnt, dfs(i), df(i, 0);
while (q--) {
int s, t, x;
cin >> s >> t >> x;
if (shu[s] != shu[t])
cout << "expand";
else if (s == t && g[s].size() == 0 && x != 0)
cout << "expand";
else {
if (abs(dis[s] - dis[t]) % 2 == x % 2 || ji[shu[s]])
cout << "tribool";
else
cout << "expand";
}
cout << "\n";
}
}
相关推荐
评论
共 8 条评论,欢迎与作者交流。
正在加载评论...