CFgym100020 Problem J. Uprtof
题意:给你n个点m无向条边。每个点是黑色或者白色的。m条边第一条边边权为2^m,第二条边边权为2^(m-1)....... 。在这个图上选择一些边连起来,使得满足:每个黑点连奇数条边,每个白点连偶数条边的条件。并且选择的边权和最小。
这是CometOJ DIV2直播上讲的一道题,大佬说的解法如下:
首先如果一个连通块的黑点个数如果是偶数,那么把黑点当做叶子节点做一下生成树,一定是满足要求的,所以如果连通块黑点个数是偶数,必然存在一个子图满足要求。而如果黑点个数是奇数,因为点的度数总和是偶数,所以必然不满足要求。按权值从大到小考虑每条边,如果去掉一条边,不改变连通性,那么这条边肯定能去掉,那么最后剩下的就是改变连通性的最小的边,也就是最小生成树上的边。因为上面的性质,可以得到,如果一条边两端的黑点个数都是偶数,那么这条边可以去掉。
所以就是先对原图求一遍最小生成森林,然后对于每棵树求出这棵树的黑点个数,然后枚举最小生成森林上的边看看是否能删去。删去条件就是删除这条边后两边的黑点个数都要是偶数,那么就可以对这棵树随便抓一个点作为树根做dfs,求出d[i]代表以i为根的子树的黑点个数,那么对于一条边(x,y),割去这条边之后就会变成 1,以y为根的子树 2,除去y子树的其他树。 保证这两部分黑点个数为偶数即可删去。
这里有一个小细节:一个数减去偶数后 它奇偶性不会改变,所以可以连续删。
细节看代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+;
int n,m,sum[N],fa[N],d[N],w[N];
struct edge{ int x,y; bool used=; }e[N<<];
vector<int> G[N];
bool vis[N]; int getfa(int x) { return x==fa[x] ? x : fa[x]=getfa(fa[x]); } void Kruskal() {
for (int i=;i<=n;i++) fa[i]=i;
for (int i=;i<=m;i++) {
int x=getfa(e[i].x),y=getfa(e[i].y);
if (x==y) continue;
G[e[i].x].push_back(e[i].y);
G[e[i].y].push_back(e[i].x);
e[i].used=; fa[y]=fa[x];
}
} void dfs(int x) {
d[x]+=w[x]; vis[x]=;
for (int i=;i<G[x].size();i++) {
int y=G[x][i];
if (vis[y]) continue;
dfs(y);
d[x]+=d[y];
}
} int main()
{
freopen("uprtoff.in","r",stdin);
freopen("uprtoff.out","w",stdout);
cin>>n>>m;
char s[N]; scanf("%s",s+);
for (int i=;i<=n;i++) w[i]=(s[i]=='B'); for (int i=;i<=m;i++) scanf("%d%d",&e[m-i+].x,&e[m-i+].y);
Kruskal(); for (int i=;i<=n;i++) if (!vis[i]) dfs(i);
for (int i=;i<=n;i++)
sum[getfa(i)]=max(sum[getfa(i)],d[i]);
for (int i=;i<=n;i++)
if (sum[i]%) { puts(""); return ; } for (int i=m;i;i--)
if (e[i].used) {
int t=min(d[e[i].x],d[e[i].y]);
if (t%!= || (sum[getfa(e[i].x)]-t)%!=) printf("%d ",m-i+);
}
return ;
}
CFgym100020 Problem J. Uprtof的更多相关文章
- 实验12:Problem J: 动物爱好者
#define null ""是用来将字符串清空的 #define none -1是用来当不存在这种动物时,返回-1. 其实这种做法有点多余,不过好理解一些. Home Web B ...
- Codeforces Gym 100342J Problem J. Triatrip 求三元环的数量 bitset
Problem J. Triatrip Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100342/at ...
- The Ninth Hunan Collegiate Programming Contest (2013) Problem J
Problem J Joking with Fermat's Last Theorem Fermat's Last Theorem: no three positive integers a, b, ...
- Codeforces Gym 100342J Problem J. Triatrip bitset 求三元环的数量
Problem J. TriatripTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100342/att ...
- Problem J: 求个最大值
Problem J: 求个最大值 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 871 Solved: 663[Submit][Status][Web ...
- Problem J. Journey with Pigs
Problem J. Journey with Pigshttp://codeforces.com/gym/241680/problem/J考察排序不等式算出来单位重量在每个村庄的收益,然后生序排列猪 ...
- 2010-2011 ACM-ICPC, NEERC, Moscow Subregional Contest Problem J. Joke 水题
Problem J. Joke 题目连接: http://codeforces.com/gym/100714 Description The problem is to cut the largest ...
- XVII Open Cup named after E.V. Pankratiev Stage 14, Grand Prix of Tatarstan, Sunday, April 2, 2017 Problem J. Terminal
题目:Problem J. TerminalInput file: standard inputOutput file: standard inputTime limit: 2 secondsMemo ...
- 2018 Multi-University Training Contest 4 Problem J. Let Sudoku Rotate 【DFS+剪枝+矩阵旋转】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6341 Problem J. Let Sudoku Rotate Time Limit: 2000/100 ...
随机推荐
- 初学Vue
指令.组件.数据 指令 指令带有前缀,v-表示它们是Vue提供的特殊属性.如: v-bind:绑定元素属性,如:v-bind:title v-if:条件,绑定DOM 的结构 v-for:循环,使用Ar ...
- 二、Redis启动、停止、Redis命令行的操作
1.redis命令 redis执行了make install后,redis的课执行文件都会自动复制到 /usr/local/bin 目录 redis-server redis服务器 redis-cli ...
- Android功耗评测系列之——软件评测方案原理
软件评测方案也有很多种,但核心原理都是同一个. 软件评测方案中,所有Android功耗的统计都是通过代码进行估算,没有任何实体电路和硬件设备参与统计汇报. 这个配置文件存储在Android ...
- jquery 选项卡切换 带背景图片
html <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <ti ...
- 【leetcode】980. Unique Paths III
题目如下: On a 2-dimensional grid, there are 4 types of squares: 1 represents the starting square. Ther ...
- 测试demo controllerweb.xml
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://w ...
- android:layout_gravity和android:gravity的区别 (转)
转:http://blog.csdn.net/shakespeare001/article/details/7843460 1.首先来看看android:layout_gravity和android: ...
- Weblogic console控制台密码更改后导致重启服务失败
weblogic版本10.3.3.0 更改控制台密码后,服务重启失败,报错如下: ----------------------------------------------------------- ...
- 不是有效的win32应用程序
问题描述: 用vs2012编写的程序在xp下运行提示"不是有效的win32应用程序", 改成静态编译还是会提示上面的错误 解决办法: 原来常规里面的平台工具集的设置如上,更改为下面 ...
- HTML-参考手册: 颜色混搭
ylbtech-HTML-参考手册: 颜色混搭 1.返回顶部 1. HTML 颜色混搭 混搭两种颜色,并查看效果: 选择颜色: #FF0000 #0000FF 顶部颜色: ...