首页 > 其他分享 >二分图判定 代码源初级

二分图判定 代码源初级

时间:2024-08-12 14:51:36浏览次数:10  
标签:二分 return idx int color 初级 判定 false

// 1001 二分图判定.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <memory.h>

using namespace std;
/*
http://oj.daimayuan.top/course/14/problem/797

给你一张简单无向图,你需要判断这张图是否为二分图。

图用以下形式给出:

第一行输入两个整数 n,m,表示图的顶点数和边数,顶点编号从 1到 n。

接下来 m行,每行两个整数 x,y,表示 x和 y之间有一条边。

输出一个字符串 Yes 或者 No,Yes 表示是二分图。

输入格式
第一行两个整数 n,m。

接下来 m行,每行有两个整数,代表一条边。

输出格式
输出一个字符串表示答案。

样例输入
4 4
1 2
2 3
3 4
1 4
样例输出
Yes
数据规模
对于所有数据,保证 2≤n≤1000,0≤m≤10000,1≤x,y≤n,x≠y。
*/

const int N = 1010, M = 20010;
int h[N], e[M], ne[M], idx;
int n, m;
int color[N]; int cnt;
int flag = 0;

void add(int a, int b) {
	e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}

bool dfs(int p, int c) {
	if (color[p] == c) return true;
	if (color[p] != 0 && color[p] != c) return false;
	

	cnt++;
	color[p] = c;

	for (int i = h[p]; i != -1; i = ne[i]) {
		int j = e[i];
		if (color[j] == 0) {
			if (dfs(j, 3 - c) == false) return false;
		}
		else if (color[j] == c) { return false; }
	}
	
	return true;
}

int main() {
	cin >> n >> m;
	memset(h, -1, sizeof h);
	for (int i = 0; i < m; i++) {
		int a, b; cin >> a >> b;
		add(a, b); add(b, a);
	}

	for (int i = 1; i <= n; i++) {
		if (color[i] == 0) {
			if (dfs(i, 1)) {
				cout << "Yes" << endl; return 0;
			}
		}
	}

	cout << "No" << endl; 
	return 0;
}

标签:二分,return,idx,int,color,初级,判定,false
From: https://www.cnblogs.com/itdef/p/18354932

相关文章

  • 算法板子:质数——判定质数、分解质因数、筛质数
    目录一、判定质数1.代码二、分解质因数1.质因数的概念2.代码三、筛质数——获取1~n中所有质数的个数1.合数的概念2.代码一、判定质数1.代码#include<iostream>usingnamespacestd;boolis_prime(intx){//1不是质数,需要特判if(x==1)r......
  • wqs二分
    wqs二分用来处理一类带有限制的问题,如恰好选\(k\)个,本质是通过二分来规避这个选取数量的限制。使用前提:原问题具有凹凸性。设\(g_i\)表示选\(i\)个物品的答案,那么所有\((i,g_i)\)点组成一个凸包,满足\(g'(k)\)单调。这类题目通常有以下特点:如果不限制选的个数,那么......
  • 黑马Java零基础视频教程精华部分_15_基本查找/顺序查找、二分查找/折半查找、插值查找
    系列文章目录文章目录系列文章目录一、基本查找/顺序查找核心思想:从0索引开始挨个往后查找代码:练习:定义一个方法利用基本查找,查询某个元素在数组中的索引,数组包含重复数据。二、二分查找/折半查找核心思想:属于有序查找算法。用给定值先与中间结点比较,每次排除一半的......
  • 模板 - 二分&三分
    二分&三分整数二分intBinarySearch(constintL,constintR){ intl=L-1,r=R+1; while(l+1<r) { intmid=l+r>>1; if(check(mid))l=mid; elser=mid; } returnl;}浮点数二分constdoubleEPS=1e-6;doubleBinarySearch(constdoubleL,constdouble......
  • 关于二分图上的最大匹配、最小点覆盖、最大独立集以及最大权闭合子图的联系
    没有点权和边权的时候,不讨论最大权闭合子图,最大匹配=最小点覆盖=点数-最大独立集最小点覆盖=点数-最大独立集:这个很好理解,考虑只有一条边的二分图的情况,点覆盖要求两个端点至少选一个,独立集要求两个端点最多选一个,是互补的关系,这意味着一个合法点覆盖的点集与一个合法独立集的......
  • 清晰易懂二分查找算法 你确定不看吗?
    @目录前言简介一、二分查找算法的原理是什么?1.确定搜索范围:2.计算中间位置:3.比较中间元素:4.调整搜索范围:5.重复迭代:二、二分查找算法的优缺点是什么?优点:缺点:三、java实现二分查找案例总结前言请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i、提示:以下是本篇文......
  • 学习笔记 整体二分
    整体二分是一种离线算法记[l,r]为答案的值域,[L,R]为答案的定义域。(也就是说求答案时仅考虑下标在区间[L,R]内的操作和询问,这其中询问的答案在[l,r]内)我们首先把所有操作按时间顺序存入数组中,然后开始分治。在每一层分治中,利用数据结构(常见的是树状数组)统计当前查询的......
  • 冒泡 选择 二分
    importjava.util.Arrays;importjava.util.Random;importjava.util.Scanner;publicclassApp{publicstaticfinalintLENGTH=6;publicstaticRandomrandom=newRandom();publicstaticScannerscanner=newScanner(System.in);publi......
  • 整体二分
    学了一下,感觉不深刻。说是整体二分,不如说是离线的归并排序。考虑这个问题:LuoguP3834【模板】可持久化线段树2\(m\)次询问,每次询问给出\((l,r,k)\),问\([l,r]\)中第\(k\)小的值。我们首先先简化一下:如果\(m=1\),怎么维护?先二分出一个\(x\),建立树状数组维护\(\lex\)......
  • D39 2-SAT P3209 [HNOI2010] 平面图判定
    视频链接:D392-SATP3209[HNOI2010]平面图判定_哔哩哔哩_bilibili   图论(十三)——平面图和对偶图_图论(十三)——平面图和对偶图-CSDN博客P3209[HNOI2010]平面图判定-洛谷|计算机科学教育新生态(luogu.com.cn)#include<iostream>#include<cstring>#incl......