题意:给你一张无向图,要求对这张图进行删边操作,要求删边之后的图的总边数 >= ceil((n + m) / 2), 每个点的度数 >= ceil(deg[i] / 2)。(deg[i]是原图中i的度数)

思路1:模拟 + 乱搞

直接暴力删就行了,读入边之后随机打乱一下就很难被hack了。

代码:

#include <bits/stdc++.h>
#define LL long long
#define INF 0x3f3f3f3f
#define db double
#define pii pair<int, int>
using namespace std;
const int maxn = 1000010;
struct node {
int u, v, id;
};
vector<node> G;
int deg[maxn], limit[maxn], a[maxn];
pii b[maxn];
const LL mod = 1e9 + 7;
LL add(LL x, LL y) {return (x + y) % mod;}
LL mul(LL x, LL y) {return (x * y) % mod;}
bool vis[maxn];
bool cmp(int x, int y) {
return deg[x] > deg[y];
}
int main() {
int n, m, u, v;
scanf("%d%d", &n, &m);
int tot_limit = (n + m + 1) / 2;
for (int i = 1; i <= m; i++) {
scanf("%d%d", &u, &v);
// G[u].push_back((node){u, v, i});
// G[v].push_back((node){v, u, i});
G.push_back((node){u, v, i});
deg[u]++;
deg[v]++;
}
for (int i = 1; i <= n; i++) {
limit[i] = (deg[i] + 1) / 2;
}
random_shuffle(G.begin(), G.end());
int ans = m;
for (int j = 0; j < G.size() && ans > tot_limit; j++) {
int v = G[j].v, now = G[j].u;
if(deg[v] == limit[v]) continue;
if(deg[now] == limit[now]) continue;
vis[j] = 1;
ans--;
deg[v]--;
deg[now]--;
}
printf("%d\n", ans);
for (int i = 0; i < m; i++) {
if(vis[i]) continue;
printf("%d %d\n", G[i].u, G[i].v);
}
}

思路2(官方题解):新建0号点,把0号点和图中所有度数为奇数的点相连,形成一张新图。在新图上跑一遍欧拉回路,把欧拉回路记录的边中偶数位置的删掉,删的时候如果是新加的边,就直接删了。否则,看一下这条边相邻的两条边是不是新加的边并且可以删,如果可以,那就删新加的边,否则删这条边。即迫不得已的情况才会删除原图的边。

代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000010;
struct edge {
int u, v, flag;
}; int st[maxn * 2], ans[maxn * 2], re[maxn * 2];
edge a[maxn * 2];
int head[maxn], id[maxn * 4], Next[maxn * 4], ver[maxn * 4], tot, totm, tot_ans;
bool v[maxn * 4], vis[maxn * 4];
int deg[maxn];
int Top;
void add(int x, int y, int z) {
ver[++tot] = y, id[tot] = z, Next[tot] = head[x], head[x] = tot;
}
void euler (int s) {
tot_ans = 0;
st[++Top] = s;
while(Top > 0) {
int x = st[Top], i = head[x];
while(i && v[i]) i = Next[i];
if(i) {
st[++Top] = ver[i];
re[Top] = id[i];
v[i] = v[i ^ 1] = 1;
head[x] = Next[i];
} else {
ans[++tot_ans] = re[Top];
Top--;
}
}
}
int main() {
int n, m, x, y;
scanf("%d%d", &n, &m);
tot = 1;
for (int i = 1; i <= m; i++) {
scanf("%d%d", &x, &y);
totm++;
a[totm] = (edge){x, y, 1};
add(x, y, totm), add(y, x, totm);
deg[x]++, deg[y]++;
}
for (int i = 1; i <= n; i++) {
if(deg[i] & 1) {
totm++;
a[totm] = (edge){0, i, 0};
add(0, i, totm), add(i, 0, totm);
}
}
int res = m;
for (int i = 0; i <= n; i++) {
euler(i);
for (int j = 2; j <= tot_ans; j += 2) {
int now = ans[j];
if(a[now].flag == 0) vis[now] = 1;
else {
int tmp = ans[j - 1];
if(a[tmp].flag == 0 && vis[tmp] == 0) {
vis[tmp] = 1;
continue;
}
int Next = j + 1;
if(j == tot_ans) Next = 1;
tmp = ans[Next];
if(a[tmp].flag == 0 && vis[tmp] == 0) {
vis[tmp] = 1;
continue;
}
vis[now] = 1;
res--;
}
}
}
printf("%d\n", res);
for (int i = 1; i <= totm; i++) {
if(vis[i] == 0) {
if(a[i].flag == 1) {
printf("%d %d\n", a[i].u, a[i].v);
}
}
}
}
//6 6
//3 4
//4 5
//5 3
//1 3
//1 2
//2 3

Codeforces 1186F - Vus the Cossack and a Graph 模拟乱搞/欧拉回路的更多相关文章

  1. @codeforces - 1186F@ Vus the Cossack and a Graph

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个 n 点 m 边的图(n, m<=10^6),记第 ...

  2. Codeforces F. Vus the Cossack and Numbers(贪心)

    题目描述: D. Vus the Cossack and Numbers Vus the Cossack has nn real numbers aiai. It is known that the ...

  3. codeforces 1186C Vus the Cossack and Strings

    题目链接:https://codeforc.es/contest/1186/problem/C 题目大意:xxxxx(自认为讲不清.for instance) 例如:a="01100010& ...

  4. codeforces 658C C. Bear and Forgotten Tree 3(tree+乱搞)

    题目链接: C. Bear and Forgotten Tree 3 time limit per test 2 seconds memory limit per test 256 megabytes ...

  5. Codeforces 193E - Fibonacci Number(打表找规律+乱搞)

    Codeforces 题目传送门 & 洛谷题目传送门 蠢蠢的我竟然第一眼想套通项公式?然鹅显然 \(5\) 在 \(\bmod 10^{13}\) 意义下并没有二次剩余--我真是活回去了... ...

  6. Codeforces Round #493 (Div. 2) C. Convert to Ones 乱搞_构造_好题

    题意: 给你一个长度为 nnn 的 010101串 ,你有两种操作: 1.将一个子串翻转,花费 XXX 2.将一个子串中的0变成1,1变成0,花费 YYY 求你将这个01串变成全是1的串的最少花费. ...

  7. CodeForces - 1186 C. Vus the Cossack and Strings (异或)

    Vus the Cossack has two binary strings, that is, strings that consist only of "0" and &quo ...

  8. Vus the Cossack and Strings(Codeforces Round #571 (Div. 2))(大佬的位运算实在是太强了!)

    C. Vus the Cossack and Strings Vus the Cossack has two binary strings, that is, strings that consist ...

  9. Codeforces Round #571 (Div. 2)-D. Vus the Cossack and Numbers

    Vus the Cossack has nn real numbers aiai. It is known that the sum of all numbers is equal to 00. He ...

随机推荐

  1. Sass-数据类型

    Sass和JavaScript语言类似,也具有自己的数据类型,在Sass中包含一下几种数据类型 数字:如,1,2,13,10px; 字符串: 有引号字符串或无引号字符串,如,“foo”,"b ...

  2. postgresql绿色版安装及Navicat创建数据库,导入导出sql

    转载:https://www.cnblogs.com/winkey4986/p/5360551.html 1.设置安装路径为:D:\soft\pgsql,数据存储路径为:D:\soft\pgsql\d ...

  3. Center os 用户环境变量

    vi ~/.bash_profile进入用户环境变量设置 export JAVA_HOME=/usr/java/jdk1.7.0_76export JAVA_BIN=$JAVA_HOME/binexp ...

  4. vue tab切换布局

    页面 功能 点击tab1和tab2,content内容切换content1和content2 <template> <div> <div class="tab& ...

  5. 您的加密USB驱动器是否安全?黑客又是如何攻破的?

    您如何确定您使用的“安全”USB驱动器是否真的安全,并且您存储的数据无法提取?这正是Google公司和中国网络安全研究人员在最近的2018年黑帽美国大会上以艰难的方式攻击加密的USB密钥”的问题. 研 ...

  6. 终极解决方案: Invalid character found in the request target.

    终极解决方案:(导出可能出现) 我的tomcat版本是8.5.32,导出时遇到以下报错. 报错日志: Invalid character found in the request target. Th ...

  7. 【leetcode】436. Find Right Interval

    题目如下: 解题思路:题目要求的是对于任意一个区间i,要找出一个区间j,使得j的起点最接近i的终点.既然这样,我们可以把所有区间的终点组成一个列表,并按大小排序,使用二分查找就可以快速找到j区间.注意 ...

  8. 【JVM】JVM参数

    JVM参数的含义  参数名称 含义 默认值   -Xms 初始堆大小 物理内存的1/64(<1GB) 默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆 ...

  9. 使用PowerShell下载必应图片

    今天想聊聊POWERSHELL对于WEB页面的一些应用,本人也是最近才发觉其实PS也是可以做爬虫的...所以想抛砖引玉给大家一个思路. 这次要用到的主要命令是 invoke-webrequest 先来 ...

  10. 组合的输出(回溯、dfs)

    问题 O: [回溯法]组合的输出 题目描述 排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且r<=n),我们可以简单地将n个元素理解为自然数1,2,…,n,从中任取r ...