//二分图的判定
//染色法
#include
#include
#include
using namespace std;
const int N = 10000;
int h[N],e[N],ne[N],idx;
int color[N];//染色为1或者2
void add(int x,int y){
e[++idx] = y,ne[idx] = h[x],h[x] = idx;
}
bool dfs(int u,int c)//需要将u这个点染成c色
{
color[u] = c;
for(int i = h[u] ;i ; i = ne[i]){
int v = e[i];//对面的点
if(!color[v]){//如果没有染色
if(dfs(v,3-c)) return 1;//u=1则v=2,u=2,v=1;有奇数环则一直返回1
}
else if(color[v] == c) return 1;//表示v与u同一个集合,且有边,则有奇环
}
return 0;
}
int main()
{
cin>>n>>m;
for(int i=0;i>a>>b;
add(a,b),add(b,a);
}
bool flag =0;
for(int i= 1; i <= n ;i++){
if(!color[i]){
if(dfs(i,1)){
flag = 1;
break;
}
}
}
if(flag) puts("No");
else put("Yes");
return 0;
}
判定:关押罪犯:https://www.acwing.com/problem/content/259/
#include
#include
#include
#include
using namespace std;
const int N = 200010.;
int h[N],e[N],ne[N],v[N],idx;
void add(int x,int y,int z){
e[++idx] = y,ne[idx] = h[x], v[idx] = z, h[x] = idx;
}
int n,m;
int color[N];
int dfs(int u,int c,int limit){
color[u] = c;
for(int i = h[u]; i; i = ne[i]){
if(v[i] <= limit) continue;
int j = e[i];
if(!color[j])
{
if(dfs(j,3-c,limit)) return 1;
}
else if(color[j] == c) return 1;
}
return 0;
}
int check(int limit){
memset(color,0,sizeof color);
for(int i = 1; i <= n ; i++){
if(color[i] == 0){
if(dfs(i,1,limit)) return false;
}
}
return true;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i = 1; i <= m; i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);add(y,x,z);
}
int l = 0, r = 1e9;
while(l < r){
int mid = (r+l) >> 1;
if(check(mid)) r = mid;
else l = mid + 1;
}
printf("%d\n",l);
return 0;
}
最大匹配:
P3386 【模板】二分图最大匹配 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include
#include
#include
using namespace std;
const int N = 1e5+10;
int n,m,s;
bool st[N];
int match[N];
int h[N],e[N],ne[N],idx;
void add(int x,int y)
{
e[++idx]=y,ne[idx]=h[x],h[x]=idx;
}
bool dfs(int u)
{
for(int i=h[u];i;i=ne[i]){
int v=e[i];
if(!st[v]){
st[v]=true;
if(!match[v]||dfs(match[v])){
match[v]=u;
return true;
}
}
}
return false;
}
int main()
{
scanf("%d%d%d",&n,&m,&s);
for(int i=1;i<=s;i++){
int x,y;
scanf("%d%d",&x,&y);
add(x,y);
}
int ans=0;
for(int i=1;i<=n;i++){
memset(st,false,sizeof st);
if(dfs(i)) ans++;
}
printf("%d",ans);
return 0;
}