【题目大意】

小奇特别喜欢猪,于是他养了$n$只可爱的猪,但这些猪被魔法猪教会了魔法,一不看着某些猪就会自己打起来。

小奇要带着他的猪讨伐战狂,路途中遇到了一条河。小奇找到了一条船,可惜这条船一次只能载小奇外加一只猪(可以不载猪),于是小奇只能在两条河岸之间来回运送猪或者空船跑路。

这些猪之间的关系可以用一些三元组$(a,b,c)$表示,当$a,b,c$号猪与小奇不在一起时,他们会进行斗殴。(不在一起就是指小奇此时处于河岸中央或者河对岸)。

当然,小奇在运送猪的时候希望猪之间不发生任何斗殴现象,他希望询问你是否有运送方案。

有多组数据。

$T \leq 10, n \leq 1000, m \leq 3000$

【题解】

明显需要有一头猪在所有三元组里都出现,不然一定不可行,设这头猪为$tar$。

那么考虑$tar$要怎么运送,先把他运到对岸,然后运送若干的猪到对岸,再把它运回来,把其他猪运到对岸,在把它运到对岸。

那么每个三元组变成了二元组,对应连边。

很明显按照刚刚的过程,设$tar$回来的时候,小奇带的上一个是$i$;带回来后,小奇带的下一个是$j$。

求得就是删掉$i,j$后,剩下的点是否能够构成二分图。

枚举删掉的点$i$,找出dfs树,那么每个奇环就是若干个由一条返祖边代表的奇环的异或和

一个点$x$被删掉后,为二分图,当且仅当:

1. 所有返祖边代表的奇环,在树上都经过$x$;

2. $x$的所有子树中没有一个子树内有一条奇返祖边和偶返祖边(分别形成奇环、偶环,因为这样那个删掉$x$,由这两条返祖边构成的奇环仍在)

第一个条件做一遍树上前缀和即可,第二个做树形dp即可。

复杂度$O(Tn^2)$。

# include <stdio.h>
# include <string.h>
# include <iostream>
# include <algorithm>
// # include <bits/stdc++.h> using namespace std; typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const int M = 3e3 + , N = 1e3 + ;
const int mod = 1e9+, inf = 1e9; inline int getint() {
int x = ; char ch = getchar();
while(!isdigit(ch)) ch = getchar();
while(isdigit(ch)) x = (x<<) + (x<<) + ch - '', ch = getchar();
return x;
} int n, m, cnt[N];
struct pa {
int a, b, c;
}p[M]; int head[N], nxt[M+M], to[M+M], tot=;
inline void add(int u, int v) {
++tot; nxt[tot] = head[u]; head[u] = tot; to[tot] = v;
}
inline void adde(int u, int v) {
add(u, v), add(v, u);
} bool ok;
int vis[N], dep[N], f[N][], g[N], par[N], ocnt;
inline void dfs(int x, int fa = ) {
dep[x] = dep[fa] + ;
vis[x] = ; par[x] = fa;
for (int i=head[x], y; i; i=nxt[i]) {
y = to[i];
if(vis[y]) {
if(vis[y] == && dep[y] < dep[x]) {
// cout << x << "-->" << y << endl;
int p = (dep[x]-dep[y]+)&;
f[x][p] = min(f[x][p], dep[y]);
if(p) {
// cerr << x << ' ' << y << endl;
g[x] ++, g[par[y]] --;
++ ocnt;
}
}
continue;
}
dfs(y, x);
f[x][] = min(f[x][], f[y][]);
f[x][] = min(f[x][], f[y][]);
}
} inline void gans(int x, int fa) {
vis[x] = ; bool fl = ;
for (int i=head[x]; i; i=nxt[i]) {
if(vis[to[i]]) continue;
gans(to[i], x);
if(f[to[i]][] < dep[x] && f[to[i]][] < dep[x]) fl = ;
g[x] += g[to[i]];
}
if(g[x] == ocnt && fl) ok = ;
} inline void sol() {
n = getint(), m = getint(); tot = ;
for (int i=; i<=n; ++i) head[i] = cnt[i] = ;
for (int i=; i<=m; ++i) {
++ cnt[p[i].a = getint()];
++ cnt[p[i].b = getint()];
++ cnt[p[i].c = getint()];
}
int tar = -;
for (int i=; i<=n; ++i) if(cnt[i] == m) { tar = i; break; }
if(tar == -) {
puts("no");
return ;
}
for (int i=; i<=m; ++i) {
if(p[i].a == tar) adde(p[i].b, p[i].c);
if(p[i].b == tar) adde(p[i].a, p[i].c);
if(p[i].c == tar) adde(p[i].a, p[i].b);
}
for (int x=; x<=n; ++x) {
if(tar == x) continue;
ocnt = ; ok = ;
for (int i=; i<=n; ++i) g[i] = , par[i] = , f[i][] = f[i][] = inf, dep[i] = vis[i] = ;
vis[x] = vis[tar] = ;
for (int i=; i<=n; ++i) if(!vis[i]) dfs(i, );
for (int i=; i<=n; ++i) vis[i] = ;
vis[x] = vis[tar] = ;
for (int i=; i<=n; ++i) if(!vis[i]) gans(i, );
if(ok) {
puts("yes");
return ;
}
}
puts("no");
} int main() {
freopen("river.in", "r", stdin);
freopen("river.out", "w", stdout);
int T; T = getint();
while(T--) sol();
return ;
}

省队集训Day1 过河的更多相关文章

  1. FJ省队集训DAY1 T1

    题意:有一堆兔子,还有一个r为半径的圆,要求找到最大集合满足这个集合里的兔子两两连边的直线不经过圆. 思路:发现如果有两个点之间连边不经过圆,那么他们到圆的切线会构成一段区间,那么这两个点的区间一定会 ...

  2. 省队集训 Day1 残缺的字符串

    [题目大意] 双串带通配符匹配. $|S|, |T| \leq 5 * 10^5$ TL: 2s [题解] 参考bzoj 4503 可以设计如下函数 A[i] * B[i] * (A[i] - B[i ...

  3. 省队集训Day1 睡觉困难综合征

    传送门:https://www.luogu.org/problem/show?pid=3613 [题解] 按二进制位分开,对于每一位,用“起床困难综合征”的方法贪心做. 写棵LCT,维护正反两种权值, ...

  4. 省队集训Day1 总统选举

    [题目大意] 一个$n$个数的序列,$m$次操作,每次选择一段区间$[l, r]$,求出$[l, r]$中出现超过一半的数. 如果没有超过一半的数,那么就把答案钦定为$s$,每次会有$k$个数进行改变 ...

  5. HN2018省队集训

    HN2018省队集训 Day1 今天的题目来自于雅礼的高二学长\(dy0607\). 压缩包下载 密码: 27n7 流水账 震惊!穿着该校校服竟然在四大名校畅通无阻?霸主地位已定? \(7:10\)从 ...

  6. 【欧拉回路+最小生成树】SD开车@山东2018省队一轮集训day1

    目录 [欧拉回路+最小生成树]SD开车@山东2018省队一轮集训day1 PROBLEM 题目描述 输入 输出 样例输入 样例输出 提示 SOLUTION CODE [欧拉回路+最小生成树]SD开车@ ...

  7. JS省队集训记

    不知不觉省队集训已经结束,离noi也越来越近了呢 论考前实战训练的重要性,让我随便总结一下这几天的考试 Day 1 T1 唉,感觉跟xj测试很像啊?meet in middle,不过这种题不多测是什么 ...

  8. [2018HN省队集训D9T1] circle

    [2018HN省队集训D9T1] circle 题意 给定一个 \(n\) 个点的竞赛图并在其中钦定了 \(k\) 个点, 数据保证删去钦定的 \(k\) 个点后这个图没有环. 问在不删去钦定的这 \ ...

  9. [2018HN省队集训D8T1] 杀毒软件

    [2018HN省队集训D8T1] 杀毒软件 题意 给定一个 \(m\) 个01串的字典以及一个长度为 \(n\) 的 01? 序列. 对这个序列进行 \(q\) 次操作, 修改某个位置的字符情况以及查 ...

随机推荐

  1. C++读取文件统计单词个数及频率

    1.Github链接 GitHub链接地址https://github.com/Zzwenm/PersonProject-C2 2.PSP表格 PSP2.1 Personal Software Pro ...

  2. 福大软工1816:beta版本冲刺前准备

    BETA 版冲刺前准备 队名:第三视角 作业链接 组长博客 应作业要求为了更加顺利地开展beta版本的冲刺,上次的alpha版本展示后,我们组对之前开发过程中存在的各种问题进行了全面的讨论,并对其进行 ...

  3. Microsoft.Practices.EnterpriseLibrary

    项目中使用了Microsoft.Practices.EnterpriseLibrary这个东西,根据名字猜测和微软有关系(可以翻译为:微软实践企业库). 看到了引入了两个命名空间: using Mic ...

  4. TCP系列39—拥塞控制—2、拥塞相关算法及基础知识

    一.拥塞控制的相关算法 早期的TCP协议只有基于窗口的流控(flow control)机制而没有拥塞控制机制,因而易导致网络拥塞.1988年Jacobson针对TCP在网络拥塞控制方面的不足,提出了& ...

  5. TCP系列38—拥塞控制—1、概述

    在本篇中我们继续上一篇文章wireshark的示例讲解,上一篇介绍了一个综合示例后,本篇介绍一些简单的示例,在读本篇前建议先把上一篇读完,为了节省篇幅,本篇只针对一些特殊的场景点报文进行讲解,不会像上 ...

  6. JS 书籍拓展内容

    一.面向对象

  7. xpath教程一---简单的标签搜索

    工具 Python3版本 lxml库[优点是解析快] HTML代码块[从网络中获取或者自己杜撰一个] requests[推荐安装,从网页上获取网页代码练手,再好不过了] 讲解 网页代码都是成对的标签, ...

  8. SERVER 2008 R2 SP1下的内存虚拟盘(支持32位,64位的所有windows版本)

    一时冲动把笔记本的系统换成了2008 R2 SP1的,本来想着用笔记本开HYPER-V的,结果是失败了,我发现我的4750G开了HYPER-V后CPU一直居高不下,其中有个什么系统软件保护的服务就占用 ...

  9. vue-cli3配置postcss-cssnext

    1. // npm install autoprefixer --save-dev 此步不需要了,因为postcss-cssnext自带这个依赖 npm install postcss-cssnext ...

  10. QT分析之QPushButton的初始化

    原文地址:http://blog.163.com/net_worm/blog/static/127702419201001003326522/ 在简单的QT程序的第二行,声明了一个QPushButto ...