传送门

文章目录

  • 题意:
  • 思路

题意:

给你一张nnn个点mmm个边的图,mmm条边是给定的,要求你给未给定的边赋值一个边权,使得所有边权异或和为000,求所有满足这种情况的图中最小生成树边权和最小的,输出最小生成树的边权和。

思路

我们先假设多余的边边权都为000,已经有的边的异或和为sumxorsum_{xor}sumxor​,加上多余的边跑最小生成树后如果还有多余的边不在生成树中,那么答案显然为当前MSTMSTMST的权值,因为我们可以选一条不在MSTMSTMST中的边让他的权值为sumxorsum_{xor}sumxor​。否则多余的边都在生成树里,那么一个最优的情况一定是选出一条多余的边使其边权为sumxorsum_{xor}sumxor​,其他的边权为000。
那么我们拿出来多余的边,即原图的补图,找到补图中所有的联通块,之后再用本来就有的边将联通块联通,当前的答案为ansansans,现在我们需要判断一下是否有多余的边剩下,这个可以算一下rest=n∗(n−1)2−mrest=\frac{n*(n-1)}{2}-mrest=2n∗(n−1)​−m,让后每加一条边就让rest−−rest--rest−−,最后看看是否rest>0rest>0rest>0即可,如果剩下了直接输出ansansans,否则我们需要找到一条多余的边使其边权为sumxorsum_{xor}sumxor​,我们可以枚举原图的边,来判断一下能否用原图中的边替代来让答案边的更小,注意我们上面连接补图的联通块的边不能被替代。

// Problem: C. Complete the MST
// Contest: Codeforces - Codeforces Round #715 (Div. 1)
// URL: https://codeforces.com/problemset/problem/1508/C
// Memory Limit: 256 MB
// Time Limit: 3000 ms
//
// Powered by CP Editor (https://cpeditor.org)//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].l+tr[u].r>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=1000010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n,m;
int p[N];
LL rest,xr;
bool st[N];
set<int>v[N],all;
struct Node {int a,b,w,flag; bool operator < (const Node &W) const {return w<W.w;}
}edge[N];int find(int x) {return x==p[x]? x:p[x]=find(p[x]);
}void get_block() {queue<int>q;vector<int>now;for(int i=1;i<=n;i++) {if(!st[i]) {q.push(i); st[i]=1;all.erase(i);while(q.size()) {int u=q.front(); q.pop();now.clear();for(auto x:all) {if(v[u].count(x)) continue;q.push(x); now.pb(x);st[x]=1; p[x]=u;rest--;}for(auto x:now) all.erase(x);}}}
}int main()
{//  ios::sync_with_stdio(false);
//  cin.tie(0);cin>>n>>m;rest=1ll*n*(n-1)/2-m;for(int i=1;i<=n;i++) all.insert(i),p[i]=i;for(int i=1;i<=m;i++) {int a,b,c; scanf("%d%d%d",&a,&b,&c);edge[i]={a,b,c,0};v[a].insert(b); v[b].insert(a);xr^=c;}get_block();sort(edge+1,edge+1+m);LL ans=0;for(int i=1;i<=m;i++) {int a=edge[i].a,b=edge[i].b,w=edge[i].w;a=find(a); b=find(b);if(a==b) continue;p[a]=b; ans+=w; edge[i].flag=1;}if(rest>0) {printf("%lld\n",ans);return 0;}for(int i=1;i<=n;i++) p[i]=i;for(int i=1;i<=m;i++) {int a=edge[i].a,b=edge[i].b,w=edge[i].w;a=find(a); b=find(b);if(a==b) continue;p[a]=b; if(!edge[i].flag) xr=min(xr,1ll*w);}printf("%lld\n",ans+xr);return 0;
}
/**/

Codeforces Round #715 (Div. 1) C. Complete the MST 补图 + 思维 + 最小生成树相关推荐

  1. Codeforces Round #715 (Div. 2)

    Codeforces Round #715 (Div. 2) 题号 题目 知识点 A Average Height B TMT Document C The Sports Festival 区间dp ...

  2. Codeforces Round #715 (Div. 1) B. Almost Sorted 找规律

    传送门 文章目录 题意: 思路: 题意: 思路: 找规律yydsyydsyyds. 一看没什么想法,所以打了个表,好家伙,不打不知道,一打不得了,下面是n=6n=6n=6的符合要求的情况: 不难发现, ...

  3. Codeforces Round #579 (Div. 3) F2. Complete the Projects (hard version) dp + 贪心

    传送门 文章目录 题意: 思路: 题意: 思路: 排序方式跟easyeasyeasy版本的一样,但是hardhardhard版本是输出最多能选多少,所以我们对b<0b<0b<0的情况 ...

  4. Codeforces Round #579 (Div. 3) F1. Complete the Projects (easy version) 排序 + 贪心

    传送门 文章目录 题意: 思路: 题意: 思路: 比较直观的想法就是对于bi≥0b_i\ge0bi​≥0的项目,我们将aia_iai​从小到大排序,让后依次加bib_ibi​,如果有取不到的,显然就无 ...

  5. Codeforces Round #732 (Div. 2) C. AquaMoon and Strange Sort 思维

    传送门 文章目录 题意: 思路: 题意: 给你nnn个数,每个数初始方向是向右,每次可以交换相邻两个位置并且将这两个位置的方向调换,问这个序列的最终状态能否是非递减且方向都向右. n≤1e5,ai≤1 ...

  6. Codeforces Round #588 (Div. 2) D. Marcin and Training Camp 思维

    传送门 文章目录 题意: 思路: 题意: 有nnn个人,每个人都有一个能力值bib_ibi​以及他会的技能aia_iai​,当他会第xxx个技能的时候,aia_iai​的第xxx位是111.定义当xx ...

  7. Codeforces Round #727 (Div. 2) E. Game with Cards dp + 思维

    传送门 文章目录 题意: 思路: 题意: 初始有左右手,上面各有一个数字为000的卡牌,每次都有一个新卡kik_iki​,你可以将其放在左手或者右手,使两只手上的卡片范围在[ll,i,rl,i][l_ ...

  8. Codeforces Round #632 (Div. 2) C. Eugene and an array 思维 + 前缀和

    传送门 文章目录 题意: 思路: 题意: 给定一个长度为nnn的序列aaa,定义一段区间为好区间是这段区间的所有连续子区间的和都不为000,求好区间的个数. 思路: 套路题,定义aia_iai​的前缀 ...

  9. Codeforces Round #462 (Div. 2) C. A Twisty Movement dp + 思维转换

    传送门 文章目录 题意: 思路: 题意: 给你一个长度为nnn的只包含1,21,21,2的序列aaa,你可以至多翻转一段区间,求翻转之后最长非递减子序列是多长. 思路: 考虑如果翻转的话,翻转的子区间 ...

最新文章

  1. Unexpected key(s) in state_dict: “dense_block1.denselayer1.norm.1
  2. 编程笔试(解析及代码实现):求出一个整数中各位数上所包含全部质数之和
  3. 通过pycharm启动django
  4. 架构漫谈(1):什么是架构
  5. 人人都在讨论的大数据,你了解吗?
  6. python三方库打包项目中_将Python库打包到项目中
  7. linux快速删除60万文件,Linux下快速删除大量文件
  8. sql虚拟服务器安装,安装SQL Server 2012服务器
  9. 一个基于protobuf的极简RPC
  10. 第五周-第08章节-Python3.5-内置模块详解之shutil模块
  11. ax 2012 随笔
  12. php 翻译接口,翻译接口整理
  13. Tabular Editor学习笔记_2
  14. 程序员交接文档格式(自己整理,仅供参考,付md文档)
  15. 软件工程——软件开发模型
  16. android手机怎么删除安装包,手机里的自带软件如何卸载
  17. 23、动画及视野拓展
  18. oracle同义词删除重建,Oracle同义词的创建与删除
  19. Java编程随机发红包,红包随机算法Java实现
  20. 她是中国的计算机女神!中国首台自主设计计算机的缔造者——夏培肃(上)

热门文章

  1. 送什么给女朋友最致命?
  2. ef 关联依赖属性_基础巩固之:xmlns属性梳理
  3. linux raw设备格式化,SUSE Linux 10配置裸设备(raw devices)
  4. oracle 动态游标行数,oracle动态游标的简单实现方法
  5. java8 垃圾 不同_【不同的Java垃圾回收器的比较】
  6. python中x_python中round(x,[n])的使用
  7. typora公式zuo对齐_Markdown编辑神器-Typora
  8. 计算机科普小知识——Win7系统32位与64位的区别,该如何选择?
  9. 算法设计与分析——递归与分治策略——全排列
  10. linux显示内存状态,Linux显示内存状态