题意:如标题

思路:对于奇环,一个二分图判定就ok了,有奇环<=>非二分图。对于偶环,考虑环必定出现在双联通分量里面,可以先求出图的双联通分量,对于一个双联通分量,对于双联通分量里面的每个环,如果是偶环,则偶环已找到,否则假定存在多个奇环,则可以任选两个奇环,把共享边去掉,一定可以得到一个新偶环,这种情况下偶环也是存在的。所以不存在偶环的情况只可能是双联通分量是一个大奇环,特点是:边数=点数,且为奇。于是先dfs一下标记所有桥,用并查集标记所有双联通分量,对每个双联通分量,计算它的点数,对每条边,如果它的两个端点属于同一个双联通分量,则对应双联通分量边数+1。由于是无向边,每条边会被考虑两次。对每个双联通分量,条件改成!((cnt_v*2=cnt_e)&1),如果上述式子为true,则表示存在偶环。

 #pragma comment(linker, "/STACK:102400000,102400000")

 #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <map>
#include <queue>
#include <deque>
#include <cmath>
#include <ctime>
#include <cctype>
#include <set>
#include <bitset>
#include <functional>
#include <numeric>
#include <stdexcept>
#include <utility>
#include <vector> using namespace std; #define mem0(a) memset(a, 0, sizeof(a))
#define mem_1(a) memset(a, -1, sizeof(a))
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1
#define define_m int m = (l + r) >> 1
#define rep_up0(a, b) for (int a = 0; a < (b); a++)
#define rep_up1(a, b) for (int a = 1; a <= (b); a++)
#define rep_down0(a, b) for (int a = b - 1; a >= 0; a--)
#define rep_down1(a, b) for (int a = b; a > 0; a--)
#define all(a) (a).begin(), (a).end()
#define lowbit(x) ((x) & (-(x)))
#define constructInt4(name, a, b, c, d) name(int a = 0, int b = 0, int c = 0, int d = 0): a(a), b(b), c(c), d(d) {}
#define constructInt3(name, a, b, c) name(int a = 0, int b = 0, int c = 0): a(a), b(b), c(c) {}
#define constructInt2(name, a, b) name(int a = 0, int b = 0): a(a), b(b) {}
#define pchr(a) putchar(a)
#define pstr(a) printf("%s", a)
#define sstr(a) scanf("%s", a)
#define sint(a) scanf("%d", &a)
#define sint2(a, b) scanf("%d%d", &a, &b)
#define sint3(a, b, c) scanf("%d%d%d", &a, &b, &c)
#define pint(a) printf("%d\n", a)
#define test_print1(a) cout << "var1 = " << a << endl
#define test_print2(a, b) cout << "var1 = " << a << ", var2 = " << b << endl
#define test_print3(a, b, c) cout << "var1 = " << a << ", var2 = " << b << ", var3 = " << c << endl typedef long long LL;
typedef pair<int, int> pii;
typedef vector<int> vi; const int dx[] = {, , -, , , , -, -};
const int dy[] = {-, , , , , -, , - };
const int maxn = 1e5 + ;
const int md = ;
const int inf = 1e9 + ;
const LL inf_L = 1e18 + ;
const double pi = acos(-1.0);
const double eps = 1e-; template<class T>T gcd(T a, T b){return b==?a:gcd(b,a%b);}
template<class T>bool max_update(T &a,const T &b){if(b>a){a = b; return true;}return false;}
template<class T>bool min_update(T &a,const T &b){if(b<a){a = b; return true;}return false;}
template<class T>T condition(bool f, T a, T b){return f?a:b;}
template<class T>void copy_arr(T a[], T b[], int n){rep_up0(i,n)a[i]=b[i];}
int make_id(int x, int y, int n) { return x * n + y; } struct UFS {
vector<int> F;
void init(int n) { F.resize(n + ); for (int i = ; i <= n; i ++) F[i] = i; }
int get(int u) { if (F[u] == u) return u; return F[u] = get(F[u]); }
void add(int u, int v) { F[get(u)] = get(v); }
}; struct Graph {
vector<vector<int> > G;
void clear() { G.clear(); }
void resize(int n) { G.resize(n + ); }
void add(int u, int v) { G[u].push_back(v); }
vector<int> & operator [] (int u) { return G[u]; }
}; Graph G;
int n, m; int color[maxn];
bool BG_chk(int u, int c) {
color[u] = c;
int sz = G[u].size();
rep_up0(i, sz) {
int v = G[u][i];
if (color[v] == c) return false;
if (color[v]) continue;
if (!BG_chk(v, - c)) return false;
}
return true;
} UFS us;
int pre[maxn], low[maxn], dfs_clock;
int getBridge(int u, int fa) {
int lowu = pre[u] = ++ dfs_clock;
int child = , sz = G[u].size();
rep_up0(i, sz) {
int v = G[u][i];
if (!pre[v]) {
child ++;
int lowv = getBridge(v, u);
min_update(lowu, lowv);
if (lowv <= pre[u]) us.add(u, v);
}
else {
if (pre[v] < pre[u] && v != fa) {
min_update(lowu, pre[v]);
}
}
}
return low[u] = lowu;
} int cnt_v[maxn], cnt_e[maxn], vis[maxn];
bool findEvenRing() {
dfs_clock = ;
mem0(pre);
rep_up1(i, n) {
if (!pre[i]) {
getBridge(i, );
}
}
mem0(cnt_e);
mem0(cnt_v);
rep_up1(i, n) {
int u = us.get(i);
cnt_v[u] ++;
}
rep_up1(i, n) {
int sz = G[i].size();
rep_up0(j, sz) {
int u = G[i][j], tmp;
if ((tmp = us.get(i)) == us.get(u)) {
cnt_e[tmp] ++;
}
}
}
mem0(vis);
rep_up1(i, n) {
int u = us.get(i);
if (vis[u]) continue;
vis[u] = true;
if ((cnt_v[u] * != cnt_e[u] || !(cnt_v[u] & )) && cnt_v[u] >= ) return true;
}
return false;
} int main() {
//freopen("in.txt", "r", stdin);
int T;
cin >> T;
while (T --) {
cin >> n >> m;
G.clear();
G.resize(n);
us.init(n);
rep_up0(i, m) {
int u, v;
sint2(u, v);
G.add(u, v);
G.add(v, u);
}
bool odd = false, even = findEvenRing();
mem0(color);
rep_up1(i, n) {
if (!color[i]) {
odd = odd || !BG_chk(i, );
}
}
puts(odd? "YES" : "NO");
puts(even? "YES" : "NO");
}
return ;
}

最新文章

  1. demo和实际项目的距离
  2. centos7安装docker并设置开机启动
  3. Scala 并行和并发编程-Futures 和 Promises【翻译】
  4. ci中如何得到配置的url
  5. javascript设计模式学习之五——策略模式
  6. 当As3遇见Swift(二)
  7. VC++编译libpng
  8. 阿里云nat mysql配置
  9. java优化占用内存的方法(一)
  10. VC6.0设置选项解读(转)
  11. [AngularJS] angular-formly: Extending Types
  12. idea maven web工程明明添加了maven lib的依赖,但启动web容器时始终报No Class Found?
  13. “百度杯”CTF比赛 九月场_再见CMS(齐博cms)
  14. asp.net在配置文件里设置多种编码方式的研究
  15. linux 解压文件
  16. Linux命令之stty
  17. 使用VS Code开发.Net Core 2.0 MVC Web应用程序教程之一
  18. SharePoint Adventures : Using Claims with Reporting Services
  19. C语言自问自答
  20. 阿里云ECS centos7 支持IPv6

热门文章

  1. atom跨平台超好用的markdown实时预览
  2. mac上搭建mysql环境配置和Navicat连接mysql
  3. 【题解】P3349 [ZJOI2016]小星星 - 子集dp - 容斥
  4. kubernetes的Service是什么?
  5. 最通俗易懂的Redis发布订阅及代码实战
  6. Docker简单操作(二)
  7. Spring Security Oauth2 使用 token 访问资源服务器出现异常:Invalid token does not contain resource id (oauth2)
  8. HDU 5725 Game
  9. 学习 .net core 3----蒋金楠 笔记 构建 Asp.net core Web应用
  10. 天大福利!世界第一科技出版公司 Springer 免费开放 400 多本电子书!