基础图论笔记
知识点
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;
}

浙公网安备 33010602011771号