基础图论笔记

知识点


 

DFS,BFS
树与图的深度优先遍历,树与图的广度优先遍历
拓扑排序
Dijkstra
bellman-ford
spfa,Floyd
Prim
Kruskal
染色法判定二分图
匈牙利算法

 

 

二分图


 

 

染色法

 

 

例题ACwing 860 - 染色法判断二分图(染色法)-CSDN博客

给定一个n个点m条边的无向图,图中可能存在重边和自环。

请你判断这个图是否是二分图。

输入格式
第一行包含两个整数n和m。

接下来m行,每行包含两个整数u和v,表示点u和点v之间存在一条边。

输出格式
如果给定图是二分图,则输出“Yes”,否则输出“No”。

数据范围
1≤ n,m≤ 105

输入样例:
4 4
1 3
1 4
2 3
2 4

输出样例:
Yes

#include <bits/stdc++.h>
using namespace std;

const int N=1e5+5;
int n, m, u1, v1, flag=1, color[N]; 
vector<int> a[N];
bool dfs(int u, int c)
{
	color[u]=c;
	
	for (int i=0; i<a[u].size(); i++)
	{
		int v=a[u][i];
		if (!color[v]) 
		{
			if (!dfs(v, 3-c)) return false;
		}
		else if (color[v]==c) return false;
	}
	return true;
}
int main() 
{
	scanf("%d%d", &n, &m);
	while (m--)
	{
		scanf("%d%d", &u1, &v1);
		a[u1].push_back(v1);
		a[v1].push_back(u1);
	}
	for (int i=1; i<=n; i++)
		if (!color[i])
			if (!dfs(i, 1))
			{
				flag=0;
				break;
			}
		
	if (flag) printf("Yes");
	else printf("No");
	return 0;
}

  

 

 

例题:

二分图最大匹配P3386 【模板】二分图最大匹配 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

匈牙利算法

#include <bits/stdc++.h>
using namespace std;

const int N=505;
int n, m, e, u1, v1, ans=0, vis[N], match[N];
vector<int> a[N];
bool find(int x)
{
	for (int i=0; i<a[x].size(); i++)
	{
		int v=a[x][i];
		if (!vis[v])
		{
			vis[v]=1;
			if (!match[v] || find(match[v]))
			{
				match[v]=x;
				return true;
			}
		}
	}
	return false;
}
int main() 
{
	scanf("%d%d%d", &n, &m, &e);
	for (int i=1; i<=e; i++)
	{
		scanf("%d%d", &u1, &v1);
		a[u1].push_back(v1);
	}
	
	for (int i=1; i<=n; i++)
	{
		memset(vis, 0, sizeof vis);
		if (find(i)) ans++;
	}
	
	printf("%d", ans);
	return 0;
}

  

 

posted @ 2024-02-15 11:18  cn是大帅哥886  阅读(12)  评论(0)    收藏  举报