TopCoder SRM 682 Div1 Problem 450 SuccessfulMerger (环套树 + 分类讨论)
题意 给定一个$n$个点$n$条边的无向图,现在要把这个图进行若干次操作,并选择一个点作为首都。
要求除首都外的任意两个点$u$, $v$,从$u$走到$v$必须经过这个首都。
操作为合并两个相邻的点为一个点,即把这两个点从原图中删除,连接这两个点的边接到新的点上去。
考虑最后这个图的形态其实是一个菊花图,那么可以考虑到最后剩下的这些点其实只有选出的首都和
原图中度数为$1$的点。
但是有这么一种比较特殊的情况。

这个图也是符合题意的。
原来的图其实是一个环套树(环的大小可能为$2$)
如果这个环上存在一个度数为$2$的点(即除了和环上的点相连之外其他没有点和他相连)
那么这个点也可以被留下,但是所有这样的点中最多只能留下一个。
于是答案就很显然了。
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i)
#define MP make_pair typedef long long LL;
typedef pair <int, int> PII; const int N = 105; int vis[N], father[N], isroot[N], a[N];
int cnt;
int flag;
int n, now, ans;
int xx, yy;
map <PII, int> mp;
vector <int> v[N]; int get_circle(int x){
vis[x] = 1;
for (auto u : v[x]){
if (u == father[x]) continue;
father[u] = x;
if (vis[u]){
cnt = 0;
int w = x;
while (w ^ u){
a[++cnt] = w;
isroot[w] = cnt;
w = father[w];
} a[++cnt] = u;
isroot[u] = cnt;
return 1;
} if (get_circle(u)) return 1;
} return 0;
} void dfs(int x){
vis[x] = 1;
for (auto u : v[x]){
if (vis[u] || isroot[u]) continue;
dfs(u);
}
} class SuccessfulMerger{
public:
int minimumMergers(vector<int> road){
memset(a, 0, sizeof a);
memset(isroot, 0, sizeof isroot);
memset(father, 0, sizeof father);
memset(vis, 0, sizeof vis);
cnt = 0;
n = 0;
flag = 0;
mp.clear();
rep(i, 0, 100) v[i].clear();
for (auto u : road){
++n;
++u;
int x = n, y = u;
if (x > y) swap(x, y);
if (mp.count(MP(x, y))){
flag = 1;
xx = x, yy = y;
continue;
} mp[MP(x, y)] = 1;
v[x].push_back(y);
v[y].push_back(x);
} if (flag){
cnt = 2;
a[1] = xx;
a[2] = yy;
} else get_circle(1); if (flag){
v[xx].push_back(yy);
v[yy].push_back(xx);
} ans = n - 1;
rep(i, 1, n) if ((int)v[i].size() == 1) --ans; rep(i, 1, cnt){
int ccc = 0;
for (auto u : v[a[i]]){
int fg = 0;
rep(j, 1, cnt) if (u == a[j]) fg = 1;
if (fg == 0) ccc = 1;
} if (ccc == 0){ --ans; break; }
} return ans;
}
};
TopCoder SRM 682 Div1 Problem 450 SuccessfulMerger (环套树 + 分类讨论)的更多相关文章
- TopCoder SRM 675 Div1 Problem 500 LimitedMemorySeries1(分块)
题意 给定一个长度不超过$5*10^{6}$的数列和不超过$100$个询问,每次询问这个数列第$k$小的数,返回所有询问的和 内存限制很小,小到不能存下这个数列.(数列以种子的形式给出) 时限$10 ...
- TopCoder SRM 722 Div1 Problem 600 DominoTiling(简单插头DP)
题意 给定一个$12*12$的矩阵,每个元素是'.'或'X'.现在要求$1*2$的骨牌铺满整个矩阵, 'X'处不能放置骨牌.求方案数. 这道题其实和 Uva11270 是差不多的,就是加了一些条件. ...
- Topcoder SRM 643 Div1 250<peter_pan>
Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...
- Topcoder Srm 726 Div1 Hard
Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...
- topcoder srm 738 div1 FindThePerfectTriangle(枚举)
Problem Statement You are given the ints perimeter and area. Your task is to find a triangle wi ...
- Topcoder SRM 627 div1 HappyLettersDiv1 : 字符串
Problem Statement The Happy Letter game is played as follows: At the beginning, several players ...
- topcoder srm 685 div1
problem1 link 依次枚举每个元素$x$,作为$S$中开始选择的第一个元素.对于当前$S$中任意两个元素$i,j$,若$T[i][j]$不在$S$中,则将其加入$S$,然后继续扩展:若所有的 ...
- topcoder srm 714 div1
problem1 link 倒着想.每次添加一个右括号再添加一个左括号,直到还原.那么每次的右括号的选择范围为当前左括号后面的右括号减去后面已经使用的右括号. problem2 link 令$h(x) ...
- Topcoder SRM 605 div1 题解
日常打卡- Easy(250pts): 题目大意:你有n种汉堡包(统统吃掉-),每一种汉堡包有一个type值和一个taste值,你现在要吃掉若干个汉堡包,使得它们taste的总和*(不同的type值的 ...
随机推荐
- Hi3518EV300编译U-Boot和内核报错:loadlocale.c:130: _nl_intern_locale_data: Assertion `cnt < (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))' failed. Aborted (core dumped)
下载Hi3518EV300的SDK后编译内核和U-boot,发现爆出如下错误: scripts/kconfig/conf --silentoldconfig Kconfig Aborted (core ...
- OpenCV学习笔记(一) 环境配置
Visual Studio 2010 VS2010对应的OpenCV的lib文件(build\x86\vc10\lib)分为debug模式和release模式两种:debug模式牺牲速度,但能提供更多 ...
- android shape.xml 文件使用
设置背景色可以通过在res/drawable里定义一个xml,如下: <?xml version="1.0" encoding="utf-8"?> ...
- Nodejs-非阻塞I/O&事件驱动
1.关于es6变量 const 定义常量,不会发生改变的就用这个 let 定义局部变量 如: const fs=require('fs');//require()表示载入这个模块 function a ...
- SSRS 报表管理器 http://localhost/Reports HTTP500 内部错误处理过程
原文地址:http://www.cnblogs.com/zzry/p/5716056.html 安装了很多机器的sqlserverBI 组件 初始安装配置下 浏览报表管理器 http://localh ...
- Flask With
- luogu2093 [国家集训队]JZPFAR
题面不符?-- #include <algorithm> #include <iostream> #include <cstdio> using namespace ...
- FSMO
FSMO 编辑 本词条缺少信息栏.名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! FSMO是Flexible single master operation的缩写,意思就是灵活单主机操 ...
- java面向对象之关键字,权限修饰符
1.关键字:this,static,package,importthis:1.表示对当前对象的引用!2.表示用类的成员变量,而非函数参数,注意在函数参数和成员变量同名是进行区分!其实这是第一种用法的特 ...
- sqlserver 表值函数
一.单语句表值函数 ALTER function [dbo].[uf_get_jxc_da_sum](@dt char(8),@dt2 char(8)) RETURNS table as return ...