解题思路:

  1. 首先我们知道对于点数为偶数的联通块是不用管的

  2. 对于奇数个连通块里面的点:

  3. 点分两种:

  4. 普通的点:对于奇数个点的连通块,删除一个普通点就很好了。那么就是删除那个权值最小的普通点就可以了

  5. 割点:我们把这个点删了之后,会出现两个联通块,如果两个是偶数那么没事,如果还有连通块是奇数的话那么我们还得继续删除非这个块大小是1!

  6. 对于你删了一个割点uuu之后,出现了奇数块,如果对于这个奇数块我们继续删除里面的一个割点vvv使,一直重复上面操作使得最终都是偶数块偶数块偶数块

  7. 我们考虑一下如果vvv在原来的图中是一个普通点,那么直接删这个vvv就可以最优了没必要再删除uuu了

  8. 如果vvv在原图里面也是一个割点的话.它能把奇数块变成偶数块,那么直接在原图里面删除它,剩下的连通块都是偶数块!

  9. 综上,从终止状态往回推,如果删掉割点最优的话其实只用删掉一个割点。

  10. 那么做法就很明显了,我们在求割点的过程中记录割去这个割点后产生的联通块点个数的奇偶性,只有当割去割点后产生的联通块都是偶数才计入答案,最终再与删去非割点的最小值的结果取max。

  11. 时间复杂度:O(n)O(n)O(n)


AC代码:

代码实现的时候实际上利用了dfs树的思想,siz是统计从这个点往下dfs的子树的大小

#include <bits/stdc++.h>
#define mid ((l + r) >> 1)
#define Lson rt << 1, l , mid
#define Rson rt << 1|1, mid + 1, r
#define ms(a,al) memset(a,al,sizeof(a))
#define sfx(x) scanf("%lf",&x)
#define sfxy(x,y) scanf("%lf%lf",&x,&y)
#define sdx(x) scanf("%d",&x)
#define sdxy(x,y) scanf("%d%d",&x,&y)
#define pfx(x) printf("%.0f\n",x)
#define pfxy(x,y) printf("%.6f %.6f\n",x,y)
#define pdx(x) printf("%d\n",x)
#define pdxy(x,y) printf("%d %d\n",x,y)
#define _for(i,a,b) for( int i = (a); i < (b); ++i)
#define _rep(i,a,b) for( int i = (a); i <= (b); ++i)
#define for_(i,a,b) for( int i = (a); i >= (b); -- i)
#define rep_(i,a,b) for( int i = (a); i > (b); -- i)
#define lowbit(x) ((-x) & x)
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define INF 0x3f3f3f3f
#define hash Hash
#define next Next
#define f first
#define s second
using namespace std;
const int N = 2e6 + 10, eps = 1e-10;
typedef long long ll;
typedef unsigned long long ull;
int n, m;
int dfn[N], low[N], idx, siz[N], arr[N];
vector<int> e[N];
bool iseven[N], cut[N];
void Tarjan(int now, int root, int fa) {dfn[now]=low[now]=++idx;int child=0;siz[now] = 1;for(int i=0;i<e[now].size();i++) {int to=e[now][i];if(!dfn[to]) {child++;Tarjan(to,root,now);siz[now] += siz[to];low[now]=min(low[now],low[to]);if(siz[to] & 1 && low[to] >= dfn[now]) iseven[now] = 1;if(low[to]>=dfn[now]&&now!=root) {cut[now]=1;}}else low[now]=min(low[now],dfn[to]);}if(child>=2 && now == root) cut[now]=1;
}
inline void init() {idx = 0;for(int i = 1; i <= n; ++ i) e[i].clear(), siz[i] = cut[i] = iseven[i] = dfn[i] = low[i] = 0;
}
int main() {IOS;int T;cin >> T;while(T --) {ll sum = 0; cin >> n >> m;init();for(int i = 1; i <= n; ++ i)cin >> arr[i], sum += arr[i];for(int i = 1; i <= m; ++ i) {int u, v;cin >> u >> v;e[u].push_back(v);e[v].push_back(u);}if(n % 2 == 0) cout << sum << "\n";else {Tarjan(1,1,0);int minv = INF;for(int i = 1; i <= n; ++ i) {if(!cut[i] || !iseven[i]) minv = min(minv,arr[i]);}   cout << sum - 2ll * minv << "\n";}}return 0;
}

图论 ---- Tajran找割点 牛客多校2021 J Defend Your Country相关推荐

  1. 线段树 ---- 牛客多校2021多校第6场 H Hopping Rabbit 扫描线

    思维误区:扫描线 扫描线模板里面有两个变量一个是cover和lengthcover和lengthcover和length covercovercover是标记下面是否覆盖满了,但是covercover ...

  2. 2021牛客多校1——J:Journey of Railway Stations(线段树)

    题面 题意: 一段路上有 N N N​​​​ 个火车站,每个火车站有一个合法时间段 [ u i , v i ] [u_i, v_i] [ui​,vi​]​​​​​,相邻两个火车站有一个长度 c o s ...

  3. 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数

    目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...

  4. 牛客多校第十场F-Popping Balloons

    题目连接 牛客多校F-PoppingBalloons 题意: 用枪打气球,可以横着打三次,竖着打三次,横着打可以把那一行的气球全打下来,竖着打可以把那一列的气球全打下来,但是,每两次相邻的横着打或者竖 ...

  5. python字符串去重及排序 牛客_2018牛客多校第一场 D.Two Graphs

    题意: n个点,m1条边的图E1,n个点,m2条边的图E2.求图E2有多少子图跟图E1同构. 题解: 用STL的全排列函数next_permutation()枚举映射.对于每一种映射枚举每一条边判断合 ...

  6. 2020 牛客多校第一场

    2020 牛客多校第一场 A. B-Suffix Array 后缀数组的思想:倍增+桶排序的方式找出一串连续序列后缀的大小.虽说正常使用的时候都是字典序,但是只要修改排序方式,也能够达到一个类似的&q ...

  7. 牛客多校第四场【B-Basic Gcd Problem】

    牛客多校第四场[B-Basic Gcd Problem] 题目链接:https://ac.nowcoder.com/acm/contest/5669/B 思路:先要理解公式,多看几个数据基本就会有点想 ...

  8. 牛客多校第三场 B【Classical String Problem】

    牛客多校第三场 B[Classical String Problem] 链接:https://ac.nowcoder.com/acm/contest/5668/B 来源:牛客网 题目描述 Given ...

  9. 牛客多校三 B Black and white

    牛客多校三 B Black and white 在n*m的棋盘上,每个格子有一个数,初始可以选一定的格子标记为黑色,在任意四个形如(i1, j1)(i1, j2)(i2, j1)(i2, j2)的格子 ...

最新文章

  1. LeetCode 145. Binary Tree Postorder Traversal
  2. 2019秋第三周学习总结
  3. Win7和VS2013上使用Intel的TBB
  4. C++内存泄露检测原理
  5. Spring IoC(一)IoC容器的设计与实现:BeanFactory与ApplicationContext
  6. 运用runtime与AOP实现oc中的kvo
  7. 怎么玩转CSS内部样式表与外部样式表?
  8. pythonplotline_带误差条的python绘图线,pythonplotlinewitherrorbar
  9. 【英语学习】【WOTD】bathetic 释义/词源/示例
  10. 帆软报表跨域之插件开发中Controller中定义的方法实现CROS的GET跨域,且请求头带自定义属性
  11. 从ip_queue到nfnetlink_queue(上)
  12. 第五章 MNIST数字识别问题(二)
  13. windows netcat的安装与使用
  14. 判断Linux/Unix为32位或64位
  15. 善用佳软:如何使用Beyond Compare比对class文件
  16. cam电路原理图 h7 openmv4_Protel电路设计软件难点解答(上)
  17. QTTabBar 使用
  18. 关于认知(高效能人士的七个习惯,刻意练习,PDCA,GTD)
  19. 工作半年就迷茫,给你一盏明灯
  20. oracle 客户端的安装失败,关于安装oracle 11g client 出现安装先决条件检查全部失败...

热门文章

  1. PE 文件格式 .text .data .idata .rsrc
  2. 菜鸡记录-王爽-汇编语言-实验十(编写子程序-显示字符串)
  3. Linux期末复习题库(4)
  4. 技术19期:1分钟入门数据治理!必看!【技术篇】
  5. 基于机器视觉的智能人机交互技术
  6. 链表问题8——将单向链表按某值划分成左边小、中间相等、右边大的形式(初阶)
  7. JavaEE——JavaScript
  8. python3 django配置数据库(mysql)
  9. CoCreateInstance(转)
  10. RocketMQ命令整理