Codeforces 858F ( Codeforces Round #434 Div. 2 F ) Wizard's Tour 图论dfs
来源:互联网 发布:unity3d场景制作 编辑:程序博客网 时间:2024/05/18 20:09
要求在多个无向图当中选择最多的连接三个点的边对,每条边只能选一次。
有一种构造方法,可以使得每个连通块当中至多一条边不被选。构造方法如下:
先在图中随意dfs一棵生成树出来,再从叶子向上构造。
对于每个点,可以把与它相连的所有边分为两类:生成树上的边和其他边。现在,对于一个点,当与其相连未选的边数量为偶数时,我们就用这所有的n条边构造n/2个答案,中间点全部选现在的这个点即可;否则,我们把连向父亲的边甩给父亲,将剩下的n-1条边构造(n-1)/2个答案。这样,除了根节点上可能剩下一条边,其余的所有边都可以构造出答案。
不得不服出题人的思维。。。
#include <cstdio>#include <iostream>#include <string.h>#include <string> #include <map>#include <queue>#include <vector>#include <set>#include <algorithm>#include <math.h>#include <cmath>#include <stack>#include <iomanip>#define mem0(a) memset(a,0,sizeof(a))#define meminf(a) memset(a,0x3f,sizeof(a))using namespace std;typedef long long ll;typedef long double ld;typedef double db;const int maxn=200005, inf = 0x3f3f3f3f;const ll llinf = 0x3f3f3f3f3f3f3f3f;const ld pi = acos(-1.0L);vector<int> t[maxn];int ans[maxn][3],head[maxn];bool visit[maxn],use[maxn];int cnt,num;struct Edge {int from,to,pre;};Edge edge[maxn*2];void addedge(int from,int to) {edge[num]=(Edge){from,to,head[from]};head[from]=num++;edge[num]=(Edge){to,from,head[to]};head[to]=num++;}void dfs(int now,int fa,int pre) {visit[now] = 1;int size;for (int i=head[now];i!=-1;i=edge[i].pre) {int to=edge[i].to;if (to==0) continue;edge[i].to=edge[i^1].to=0;if (!visit[to]) {dfs(to, now, 1);if (!use[to]) t[now].push_back(to);} else t[now].push_back(to);}size = t[now].size() + pre;if (size==0) return;if (size % 2 == 0) {use[now] = 1;for (int i = 0; i+1 < size-pre; i+=2) ans[++cnt][0] = t[now][i], ans[cnt][1] = now, ans[cnt][2] = t[now][i+1];if (pre) ans[++cnt][0] = t[now][size-pre-1], ans[cnt][1] = now, ans[cnt][2] = fa;}else for (int i = 0; i + 1 < size-pre; i += 2)ans[++cnt][0] = t[now][i], ans[cnt][1] = now, ans[cnt][2] = t[now][i + 1];}int main() {int n, m, i, j, x, y;num=0;memset(head,-1,sizeof(head));scanf("%d%d", &n, &m);for (i = 1; i <= m; i++) {scanf("%d%d", &x, &y);addedge(x,y);}mem0(visit); cnt = 0; mem0(use);for (i = 1; i <= n; i++) if (!visit[i]) dfs(i, 0, 0);printf("%d\n", cnt);for (i = 1; i <= cnt; i++) printf("%d %d %d\n", ans[i][0], ans[i][1], ans[i][2]);return 0;}
阅读全文
0 0
- Codeforces 858F ( Codeforces Round #434 Div. 2 F ) Wizard's Tour 图论dfs
- codeforces 858F Wizard's Tour
- Codeforces Round #279 (Div. 2) F. Treeland Tour(lis+dfs)
- Codeforces Round #279 (Div. 2) F. Treeland Tour
- CF 858F Wizard's Tour (DFS)
- Codeforces Round #277.5 (Div. 2) F
- Codeforces Round #279 (Div. 2) F
- Codeforces Round #279 (Div. 2) F
- Codeforces Round #279 (Div. 2) B F
- Codeforces Round #277.5 (Div. 2)F题
- Codeforces Round #322 (Div. 2) F
- Codeforces Round #377 (Div. 2) F
- Codeforces Round #386 (Div. 2) F
- Codeforces Round #441 Div. 2 E,F
- Codeforces Round #442 (Div. 2) 877 F
- Codeforces Round 864F (Codeforces Round #436 Div. 2) F. Cities Excursions tarjan判环
- Codeforces Round #279 (Div. 2) F DFS 树上最长上升子序列
- Codeforces Round #436 (Div. 2) F. Cities Excursions 字典序dfs+Tarjan判环
- POJ 1811 Prime Test 【快速判质+因子分解】【模板】
- The Design of COVE: a Collaborative Ocean Visualization Environment
- 2017.10.06【NOIP提高组】模拟赛B组 整除 题解
- LeetCode-93-Restore IP Addresses 暴力
- poj 3421 X-factor Chains
- Codeforces 858F ( Codeforces Round #434 Div. 2 F ) Wizard's Tour 图论dfs
- 蓝桥杯 算法提高 数字黑洞
- Hadoop Yarn初探
- 常用算法
- 第五周项目2
- 简单模拟——LRC才不会告诉你们的事情
- 位图显示和图形界面技术(操作系统桌面显示技术)
- JavaScript 事件入门
- php中json_decode()和json_encode()的使用方法