QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#745361 | #9623. 合成大西瓜 | Tobo# | WA | 1ms | 3860kb | C++20 | 2.8kb | 2024-11-14 09:26:34 | 2024-11-14 09:26:34 |
Judging History
answer
/*
洛谷 P3388 【模板】割点(割顶)
*/
#include <iostream>
#include <vector>
#include <map>
using namespace std;
int n, m; // n:点数 m:边数
int dfn[100001], low[100001], a[100001], siz[100001], inde, res;
// dfn:记录每个点的时间戳
// low:能不经过父亲到达最小的编号,inde:时间戳,res:答案数量
bool vis[100001], flag[100001]; // flag: 答案 vis:标记是否重复
vector<int> edge[100001]; // 存图用的
void Tarjan(int u, int father)
{ // u 当前点的编号,father 自己爸爸的编号
vis[u] = true; // 标记
low[u] = dfn[u] = ++inde; // 打上时间戳
int child = 0; // 每一个点儿子数量
siz[u] = 1;
for (auto v : edge[u])
{ // 访问这个点的所有邻居 (C++11)
if (!vis[v])
{
child++; // 多了一个儿子
Tarjan(v, u); // 继续
siz[u] += siz[v];
low[u] = min(low[u], low[v]); // 更新能到的最小节点编号
if (father != u && low[v] >= dfn[u] && !flag[u])
{ // 主要代码
// 如果不是自己,且不通过父亲返回的最小点符合割点的要求,并且没有被标记过
// 要求即为:删了父亲连不上去了,即为最多连到父亲
flag[u] = true;
res++; // 记录答案
}
}
else if (v != father)
{
// 如果这个点不是自己的父亲,更新能到的最小节点编号
low[u] = min(low[u], dfn[v]);
}
}
// 主要代码,自己的话需要 2 个儿子才可以
if (father == u && child >= 2 && !flag[u])
{
flag[u] = true;
res++; // 记录答案
}
}
int main()
{
cin >> n >> m; // 读入数据
for (int i = 1; i <= n; i++)
cin >> a[i];
if (n == 1)
{
cout << a[1] << '\n';
exit(0);
}
for (int i = 1; i <= m; i++)
{ // 注意点是从 1 开始的
int x, y;
cin >> x >> y;
edge[x].push_back(y);
edge[y].push_back(x);
} // 使用 vector 存图
Tarjan(1, 1);
int ans = 0;
for (int i = 1; i <= n; i++)
{
if (!flag[i] and edge[i].size() >= 2)
ans = max(ans, a[i]);
else if (siz[i] % 2 == 0)
ans = max(ans, a[i]);
}
map<int, int> cnt;
for (int i = 1; i <= n; i++)
if (edge[i].size() == 1 or !flag[i])
cnt[a[i]]++;
for (auto &[x, y] : cnt)
if (y >= 2)
ans = max(ans, x);
cout << ans << '\n';
return 0;
}
/*
7 7
1 1 2 3 1 2 1
1 2
2 3
1 3
2 4
2 5
5 6
5 7
1 0
1
3 2
3 2 3
1 2
2 3
*/
详细
Test #1:
score: 0
Wrong Answer
time: 1ms
memory: 3860kb
input:
7 9 1 4 1 3 3 6 7 5 4 3 6 3 4 2 3 5 2 2 6 6 7 5 1 4 6
output:
4
result:
wrong answer 1st lines differ - expected: '6', found: '4'