传送门

文章目录

  • 题意:
  • 思路:

题意:

给你一张nnn个点mmm条边的简单图,让你找出尽可能多的三元环,要求每个三元环都不能共边,输出三元环数量和具体是那个。

n,m≤1e5n,m\le1e5n,m≤1e5

思路:

其实比较容易想到,我们直接贪心的去选有可能是最优的。

按照这个思想,我们考虑dfsdfsdfs,先递归到最深层,让后将与其相连的边两两组合,之后如果有多出来的边就与他的父亲组合,可以知道这样一定是最优的,因为每一层都尽可能的都用了,最多也就有一个边没有被用到。

注意图不一定连通。

//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<assert.h>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid ((tr[u].l+tr[u].r)>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=400100,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n,m;
int d[N];
set<int>v[N],s[N];
struct Node {int a,b,c;
};
vector<Node>ans;
bool st[N];
int fa[N];
int cnt;void dfs(int u) {st[u]=true;for(auto x:s[u]) {if(st[x]) continue;fa[x]=u;dfs(x);}vector<int>now;int pre=-1; now.clear();for(auto x:v[u]) {if(x==fa[u]) continue;if(pre==-1) pre=x;else ans.pb({pre,u,x}),now.pb(pre),now.pb(x),pre=-1;}for(auto x:now) {v[u].erase(v[u].find(x));v[x].erase(v[x].find(u));}if(pre!=-1&&fa[u]) {ans.pb({fa[u],u,pre});v[fa[u]].erase(u);v[u].erase(fa[u]);v[u].erase(pre);v[pre].erase(u);}}int main() {scanf("%d%d",&n,&m);for(int i=1;i<=m;i++) {int a,b; scanf("%d%d",&a,&b);v[a].insert(b); v[b].insert(a);s[a].insert(b); s[b].insert(a);}for(int i=1;i<=n;i++) if(!st[i]) {dfs(i);}printf("%d\n",ans.size());for(auto x:ans) printf("%d %d %d\n",x.a,x.b,x.c);return 0;
}

Gym - 102001K Boomerangs 构造 + 三元环相关推荐

  1. Codeforces Gym 100342J Problem J. Triatrip 求三元环的数量 bitset

    Problem J. Triatrip Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100342/at ...

  2. 【学习笔记】无向图、有向图的三元环、四元环计数问题(根号分支+bitset)

    三元环计数和四元环计数问题 无向图三元环计数问题 根号分治 bitset 无向图四元环计数问题 有向图三四元环计数问题 无向图三元环计数问题 根号分治 记 di:id_i:idi​:i 在原图中的度数 ...

  3. 牛客挑战赛51 E NIT的gcd(欧拉反演,建图优化,三元环计数)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Problem 给你一个正整数 nnn. 请你输出 ∑i=1n∑j=1n∑k=1ngcd⁡(i,j)g ...

  4. P4619 [SDOI2018]旧试题(莫比乌斯反演,建图优化三重枚举,三元环计数,神仙好题,超级清晰易懂)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P4619 [SDOI2018]旧试题(莫比乌斯反演,三元环计数) Problem 计算: ∑i=1A ...

  5. HDU - 6184 Counting Stars(思维+三元环)

    题目链接:点击查看 题目大意:给出一个 nnn 个点 mmm 条边组成的无向图,问图中有多少个"三元环对","三元环对"指的是两个三元环共用了一条边 题目分析: ...

  6. 洛谷 - P1989 无向图三元环计数(思维建图)

    题目链接:点击查看 题目大意:给出一个 nnn 个点 mmm 条边组成的无向图,求三元环的个数 题目分析:对于原图建新图,对于原来的每条边来说 如果度数不同,度数小的点指向度数大的点 如果度数相同,编 ...

  7. HDU6184【Counting Stars】(三元环计数)

    题面 传送门 给出一张无向图,求 \(4\) 个点构成两个有公共边的三元环的方案数. 题解 orz余奶奶,orz zzk 首先,如果我们知道经过每条边的三元环个数\(cnt_i\),那么答案就是\(\ ...

  8. P1989 无向图三元环计数 思维 + 建图

    传送门 文章目录 题意: 思路: 题意: 统计无向图中三元环的个数. 思路: 很明显有一种暴力的方法,就是枚举每条边,让后再跑两个点的所有边,可以卡到复杂度O(m2)O(m^2)O(m2). 我们可以 ...

  9. 基站建设(三元环计数+根号分治 / bitset)

    基站建设 problem solution code problem 给定 nnn 个地点,以及每个地点的可靠度 RiR_iRi​. 有 mmm 条光纤架,每一条连接两个不同的地点,且是双向的. 测试 ...

最新文章

  1. 码农新机会!2019-2020行业调查报告出炉,这个领域程序员缺口很大!
  2. 在数据库原表中增加字段
  3. 解决android引用library project错误
  4. 百度网页分享js代码
  5. Spring整合Hibernate中自动建表
  6. 全球域名解析商域名增量Top10:万网增量及涨幅皆第三
  7. python读取excle表格数据,将数据编辑到图像上工程
  8. Lombok中@Data注解 @ToString注解 @NoArgsConstructo注解 @AllArgsConstructor注解
  9. JavaScript数组迭代方法(图解)
  10. thinkphp 路由
  11. 请举例说明python中**运算符的含义_举例讲解Python中的身份运算符的使用方法
  12. 继续推荐几款VisualStudio的插件
  13. AnyMP4 MP3 Converter for Mac(mp3格式转换器)
  14. 微信小程序--给头像添加logo(生成海报同理)
  15. 测试微信号连接的开发的步骤
  16. 《小猪佩奇拜年歌》在QQ音乐和网易云音乐上线
  17. 网络安全之权限维持(持续更新)
  18. CAD调整十字光标的长度
  19. 如何判断初级,中级,高级等等不同级别程序员
  20. 助力白纸一般的你面试——宏任务微任务

热门文章

  1. c均值算法的设计与实现_如何使用C链表实现 LRU 算法
  2. 世界上最奇异的10种树,你都见过吗?
  3. 葛优:你们有看过我的作品吗?| 今日趣图
  4. oracle中表截断是什么意思,Oracle截断表
  5. java打印三角形_java基础打印三角形
  6. 不同用户同时并发测压_简单聊聊吞吐量(TPS)、QPS、并发数、响应时间(RT)概念...
  7. dhcp服务器显示主机名,linux – 当我没有在dhclient.conf中定义一个时,我的DHCP服务器如何知道我的机器的主机名?...
  8. php 重定向数据不丢失,PHP重定向如何实现数据不丢失?
  9. linux ubuntu 开启ssh服务,开启SSH服务远程登录ubuntu
  10. linux 核显驱动程序,支持下代核显 Intel放出Linux图形驱动