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

    $("p:eq(0)") :表p标签的第一个元素 $("p:eq(1)") :表p标签的第二个元素

  2. Nginx1.6.0+MySQL5.6.19+PHP5.5.14(centos)

    一.配置防火墙,开启80端口.3306端口 CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙. 1.关闭firewall: systemctl stop fi ...

  3. Linux批量新建文件夹(大括号表达式的应用)

    如果想要批量新建文件夹来存放照片,按照年份和月份,格式为YYYY-MM.可以使用下面命令批量新建: mkdir {2007..2009}-{01..12} 结果如下: 2007-01 2007-07 ...

  4. Web核心之tomcat汤姆猫

    web相关概念 1. 软件架构 1. C/S:客户端/服务器端 2. B/S:浏览器/服务器端 2. 资源分类 1. 静态资源:所有用户访问后,得到的结果都是一样的,称为静态资源.静态资源可以直接被浏 ...

  5. Halo(九)

    跨域问题 域名A(http://www.a.com)的 Web 应用程序中, 通过标签引入了域名B(http://ww.b.com)站点的某图片资源(http://www.b.com/image.jp ...

  6. FMX Android ZIP解压中文乱码

    在手机上解压了一个WINDOWS上的压缩文件, 发现中文是乱码的,解决方法如下: 找到System.zip.pas文件 将E := TEncoding.GetEncoding(437);   改为 E ...

  7. MVVM MVC

    在WPF的MVVM模式中,View和ViewModel之间数据和命令的关联都是通过绑定实现的,绑定后View和ViewModel并不产生直接的依赖.具体就是View中出现数据变化时会尝试修改绑定的目标 ...

  8. soj#532 set p3175

    传送门 分析 代码 #include<bits/stdc++.h> using namespace std; ; <<],Ans; int n,m,N; inline int ...

  9. kubernetes安装部署

    1.根据系统内核情况,选择对应的ali云上的镜像,作为仓库的路径指向来配置k8s https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes- ...

  10. 移动H5优化指南

    转载于http://isux.tencent.com/h5-performance.html 移动H5前端性能优化指南 概述 秒完成或使用Loading4. 基于联通3G网络平均338KB/s(2.7 ...