题意:给你一张无向图,要求对这张图进行删边操作,要求删边之后的图的总边数 >= 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. 读取的CSV

  2. Python 无法安装PyAudio问题

    一.错误与原因 在Windows上没有用于Python 3.7的轮子(预构建包)(有一个用于Python 2.7和3.4到3.6),因此需要在PC上准备构建环境以使用此包.因为有些软件包很难在Wind ...

  3. TJU 4072 3D Birds-Shooting Game

    4072.   3D Birds-Shooting Game Time Limit: 3.0 Seconds   Memory Limit: 65536K Total Runs: 167   Acce ...

  4. centos7在线安装mysql8.0.16

    一.官网复制安装源地址: 1.进入官网地址:https://dev.mysql.com/downloads/repo/yum/ 二.进入/usr/local目录下 ,创建mysql文件夹 三.使用命令 ...

  5. php stripcslashes()函数 语法

    php stripcslashes()函数 语法 作用:删除由 addcslashes() 函数添加的反斜杠.深圳直线电机 语法:stripcslashes(string) 参数: 参数 描述 str ...

  6. 【BZOJ2946&SPOJ1812】公共串(后缀自动机)

    题意:给出几个由小写字母构成的单词,求它们最长的公共子串的长度. 单词的数量<=5,单词的长度至少为1,最大为2000. 思路: #include<bits/stdc++.h> us ...

  7. paper 155:face/head pose estimation

    参考来源:http://www.cnblogs.com/lanye/p/5312620.html 人脸姿态估计:pitch,yaw,roll三种角度,分别代表上下翻转,左右翻转,平面内旋转的角度.   ...

  8. C# 实现软件注册功能

    相信很多初学编程的人都会对这个注册功能很感兴趣,我也不例外,刚学asp.net时,竞找不到这方面的实例,结果自己参考微软的一些文档自己做了一个,其实我做的这个注册功能很简单,读取计算机的CPU序列号, ...

  9. POJ 2114 (点分治)

    题目:https://vjudge.net/contest/307753#problem/B 题意:求树中路径和=k的点对是否存在 思路:点分治,这个题其实和上一题洛谷一样,只是这个数据强,我们不能直 ...

  10. 在Windows及Linux下获取毫秒级运行时间的方法

    在Windows下获取毫秒级运行时间的方法 头文件:<Windows.h> 函数原型: /*获取时钟频率,保存在结构LARGE_INTEGER中***/ WINBASEAPI BOOL W ...