Defend Your Country

题意:

n个点,m条边的简单无向连通图,每个点一个权值ai,一个连通块的贡献:(−1)块内点数∗∑ai[点i在该连通块内](-1)^{块内点数}*\sum a_{i}[点i在该连通块内](−1)块内点数∗∑ai​[点i在该连通块内]
可以任意删除一些边,求连通块贡献之和最大是多少

题解:

如果n是偶数,此时贡献就是所有点的和,显然不需要删除任何边,因为这已经是最大贡献sum
如果是奇数,我们就需要让一个点x脱离其他n-1个点,此时答案就是sum-a[x]-a[x](减的第一个x是因为x点已经不在原来连通块内,再减x是因为他是单独一个点,按照题目说的连通块贡献应该是-1 * x),所以我们要让这个a[x]是最小值
但是这样就完事了吗?
并没有,因为如果a[x]是割点,删完后还有可能产生额外的连通块。如果剩下的连通块中全都是偶数个点,此时x可以删除。如果其他连通块中存在一个是奇数,那按照贡献,这个连通块是要删除的,那肯定要比删除非割点的最小ai更差
总结:
不是割点,或者是 割点且其他连通块都是偶数个 的点是可以删除的,然后取最小值,用sum减去起2倍就可以
如何判断其他连通块是偶数
直接在tarjan中写,如图ok[i]表示该割点去掉之后,是否所有连通块都是偶数个点

我写了情况数组的init()函数,然后忘调用了,调了我两小时。。。。吐了

代码:

#include<bits/stdc++.h>
#define debug(a,b) printf("%s = %d\n",a,b);
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
clock_t startTime, endTime;
//Fe~Jozky
const ll INF_ll=1e18;
const int INF_int=0x3f3f3f3f;
inline ll read(){ll s=0,w=1ll;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1ll;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10ll+((ch-'0')*1ll),ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w;
}
void rd_test(){#ifdef ONLINE_JUDGE#elsestartTime = clock(); //计时开始freopen("in.txt","r",stdin);#endif
}
void Time_test(){#ifdef ONLINE_JUDGE#elseendTime = clock(); //计时结束printf("\n运行时间为:%lfs\n",(double)(endTime - startTime) / CLOCKS_PER_SEC);#endif
}
const int maxn=3e6+9;
vector<int>vec[maxn];
int dfn[maxn],low[maxn],deep;
int siz[maxn],ok[maxn],cut[maxn];
// u:当前点 r:本次搜索树的root
void tarjan(ll u, ll r) {dfn[u] = low[u] = ++deep;siz[u]=1;ll child = 0;for (unsigned i = 0; i < vec[u].size(); i++) {ll v = vec[u][i];if (!dfn[v]) {tarjan(v, r);siz[u]+=siz[v];low[u] = min(low[u], low[v]);if((siz[v]%2==1)&&low[v]>=dfn[u])ok[u]=0;if (low[v] >= dfn[u] && u != r)cut[u] = 1;//不是根而且他的孩子无法跨越他回到祖先if (r == u)child++; //如果是搜索树的根,统计孩子数目}low[u] = min(low[u], dfn[v]);//已经搜索过了}if (child >= 2 && u == r)//如果根节点的子树数量大于等于2 ,将根节点去掉之后两颗子树就分离了cut[r] = 1;
}
ll a[maxn];
int n,m;
void init(int n){for(int i=1;i<=n;i++){vec[i].clear();ok[i]=1;low[i]=0;dfn[i]=0;siz[i]=0;cut[i]=0;}
}
void solve(){cin>>n>>m;ll sum=0;init(n);for(int i=1;i<=n;i++)a[i]=read(),sum+=a[i];for(int i=1;i<=m;i++){int x=read(),y=read();vec[x].push_back(y);vec[y].push_back(x);}if(n%2==0){printf("%lld\n",sum);return ;}for(int i=1;i<=n;i++){if(!dfn[i])tarjan(i,i);}/*删除非个点的最小ai */ll minn=1e10;for(int i=1;i<=n;i++){if(!cut[i])//如果不是割点 minn=min(minn,a[i]);if(cut[i]&&ok[i])//是割点,且删除后其他连通分量为偶数 minn=min(minn,a[i]);}printf("%lld\n",sum-2*minn);
}
int main()
{rd_test();int t=read();while(t--){solve();}Time_test();
}

Defend Your Country相关推荐

  1. 2021牛客多校6 - Defend Your Country(点双缩点求割点)

    题目链接:点击查看 题目大意:给出一个 nnn 个点和 mmm 条边组成的无向图,每个点都有点权,现在可以删除掉任意条边,问如何才能使得贡献和最大 贡献和是指,当删掉边后,对于每个连通块而言,如果连通 ...

  2. 图论 ---- Tajran找割点 牛客多校2021 J Defend Your Country

    解题思路: 首先我们知道对于点数为偶数的联通块是不用管的 对于奇数个连通块里面的点: 点分两种: 普通的点:对于奇数个点的连通块,删除一个普通点就很好了.那么就是删除那个权值最小的普通点就可以了 割点 ...

  3. 2021牛客暑期多校训练营6

    题号 题目 知识点 A Contracting Convex Hull B Defend Ponyville C Delete Edges D Gambling Monster E Growing T ...

  4. 2021牛客暑期多校训练营6,签到题CFHI

    题号 标题 已通过代码 通过率 团队的状态 A Contracting Convex Hull 点击查看 14/112 未通过 B Defend Ponyville 点击查看 4/32 未通过 C D ...

  5. [转]体育运动比赛英语

    Tennis 网球 Athletics 竞技 Swimming 游泳 Individual Sports 体育项目 Football 足球 Games and Competitions 球类运动 Ba ...

  6. 如何用画图框住所选内容_关于国家,公民身份,住所和纳税

    如何用画图框住所选内容 Like many software engineers my life involved moving from one country to another for wor ...

  7. E03.03 A ‘Masculinity Crisis’? China Says the Boys Are Not All Right

    2021.03.03 文章目录 [英文原文] [外刊原文] [英文原文] A 'Masculinity Crisis'? China Says the Boys Are Not All Right & ...

  8. 【影片欣赏】+【英文干货】《指环王:王者归来》

    一.影片简介 <指环王:王者归来>为彼得·杰克逊导演,伊利亚·伍德.肖恩·奥斯汀等主演,于2004年在国内上映.该片包揽了当年的11项奥斯卡金像奖: 1.最佳改编剧本: 2.最佳音效剪辑: ...

  9. Codeforces 894.D Ralph And His Tour in Binary Country

    D. Ralph And His Tour in Binary Country time limit per test 2.5 seconds memory limit per test 512 me ...

最新文章

  1. vue中使用promise
  2. 解决XP系统启动慢的问题
  3. [scala-spark]4. 函数式编程
  4. CVPR 2021 | 自适应激活函数ACON:统一ReLU和Swish的新范式
  5. 关闭IOS更新功能(ios4/5/6)
  6. mysql查询条件是小数 查不到6.28_28.mysql数据库之查询
  7. SAP License:SAP 期初数据导入
  8. 22个HTML5和CSS3表单教程
  9. PHP ZipArchive 实现压缩解压Zip文件
  10. 分享几个免费的根据IP 获取地址的链接
  11. oracle官网下载过程,Oracle 11g安装步骤
  12. java多态理解通俗,说说 Java 多态那些事儿~
  13. 基于Vue3实现扫码枪扫码并生成二维码的代码解析
  14. 项目管理实战精髓培训课
  15. 简单的键盘按键记录(无码)/虚拟地址转物理地址/生成随机字符串/计算字符串哈希
  16. python从某一行开始读取文本文件
  17. Python学习整理(之一)
  18. 我对象多分你一个——BOM介绍给你啊
  19. 从零开始搭建一个8位计算机系列(四):利用LM555芯片构建单步脉冲
  20. mp4box的安装和使用

热门文章

  1. 笑到打鸣~ | 今日趣图
  2. 像小猪佩奇那样生活,需要多少钱?
  3. 程序员新人怎样在复杂代码中找 bug?
  4. 荐号 | 11个人工智能与大数据相关的个人、企业优质号
  5. 一些奇葩的元素节点object,video
  6. mysql binlog 大数据_后起之秀 | MySQL Binlog增量同步工具go-mysql-transfer实现详解
  7. 在google play开放平台上closed texting如何删除_“爷青回”!如何抢先体验《英雄联盟》手游?这份攻略送给你...
  8. oracle挂证多少钱一个月_惊呆,一条sql竟然把Oracle搞挂了
  9. html5与课程思政,“课程思政”怎样做
  10. saiku 连接 MySQL_Saiku连接mysql数据库(二)