int n; // n表示点数 int h[N], e[M], ne[M], idx; // 邻接表存储图 int color[N]; // 表示每个点的颜色,-1表示未染色,0表示白色,1表示黑色
// 参数:u表示当前节点,c表示当前点的颜色 booldfs(int u, int c) { color[u] = c; for (int i = h[u]; i != -1; i = ne[i]) { int j = e[i]; if (color[j] == -1) { if (!dfs(j, !c)) returnfalse; } elseif (color[j] == c) returnfalse; }
returntrue; }
boolcheck() { memset(color, -1, sizeof color); bool flag = true; for (int i = 1; i <= n; i ++ ) if (color[i] == -1) if (!dfs(i, 0)) { flag = false; break; } return flag; }
#include<bits/stdc++.h> usingnamespace std; constint N = 200100; int e[N], ne[N], f[N], idx = 0; int color[N], n, m; voidadd(int a, int b){ e[++idx] = b; ne[idx] = f[a]; f[a] = idx; } intmain(){ cin >> n >> m; while (m--) { int a, b; cin >> a >> b; add(a, b); add(b, a); } // 0 未染色 1 -1 对应颜色 for (int i = 1; i <= n; i++) { if (!color[i]) {//未染色 queue<int>q; color[i] = 1; q.push(i); while (!q.empty()) { int front = q.front(); q.pop();
#include<bits/stdc++.h> usingnamespace std; constint M = 100100; constint N = 510; int f[N], ne[M], e[M], idx; int match[M];//记录每一个n2的点对应的n1的点 int st[M]; //记录n2的点是否被记录过 voidadd(int a, int b){ e[++idx] = b; ne[idx] = f[a]; f[a] = idx; } // 在当前的·情况下x是否能找到对应边 boolfind(int x){ for (int i = f[x]; i; i = ne[i]) { int j = e[i]; // 对于当前次的查询j这个点是否被查询过,避免出现环形询问的问题 if (!st[j]) { st[j] = true; // n1 匹配的 j点是否被匹配过或者 上一个匹配他的点 // 能否匹配别的 if (!match[j] || find(match[j])) { st[j] = true; match[j] = x; returntrue; } } } returnfalse;
} intmain(){ int n1,n2,m; cin>>n1>>n2>>m; while(m--){ int a,b; cin>>a>>b;add(a,b); } int ans = 0; for(int i=1;i<=n1;i++){ memset(st,0,sizeof st); if (find(i)) ans++; } cout<<ans<<endl; }