二分图以及强联通分量,割点,割边代码展示
1.Leetcode 886
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+7;
vector<pair<int,int>> dislikes(maxn);
vector<int> G[maxn];
int color[maxn];
bool flag=0;
inline void dfs(int x,int c){
color[x]=c;
for(int i=0;i<G[x].size();i++){
int y=G[x][i];
if(y==x){
continue;
}
if(color[y]==c){
flag=1;
}
if(color[y]==0){
dfs(y,-c);
}
}
}
int main(){
int n,k;cin>>n>>k;
for(int i=1;i<=k;i++){
cin>>dislikes[i].first>>dislikes[i].second;
}
for(int i=1;i<=k;i++){
G[dislikes[i].first].push_back(dislikes[i].second);
G[dislikes[i].second].push_back(dislikes[i].first);
}
for(int i=1;i<=n;i++){
if(color[i]==0){
dfs(i,1);
}
}
if(flag){
cout<<"No"<<endl;
}
else{
cout<<"YES"<<endl;
}
}
2.https://codeforces.com/contest/741/problem/C
3.https://www.luogu.com.cn/problem/P3386
#include<bits/stdc++.h>
using namespace std;
const int maxn=1005;
int n,m,t;
int mch[maxn],vis[maxn];
vector<int> e[maxn];
bool dfs(int u,int tag){
//如果点已经访问过了
if(vis[u]==tag){
return false;
}
vis[u]=tag;
for(int v:e[u]){//遍历所有的邻接点v
if(mch[v]==0 || dfs(mch[v],tag)){
//若是v未匹配,或v的原配能找到新的对象
mch[v]=u;
return true;
}
}
return false;
}
int main(){
cin>>n>>m>>t;
for(int i=1;i<=t;i++){
int u,v;cin>>u>>v;
e[u].push_back(v);
}
int ans=0;
for(int i=1;i<=n;i++){
if(dfs(i,i)){
++ans;
}
}
cout<<ans<<endl;
}
4.https://ac.nowcoder.com/acm/problem/236754
#include<bits/stdc++.h>
using namespace std;
const int N=505;
int n,m;
int pre[N],g[N][N],vN,uN;
bool used[N];
bool dfs(int u){
for(int v=1;v<=n;v++){
if(g[u][v] && !used[v]){
used[v]=true;
if(pre[v]==-1 || dfs(pre[v])){
pre[v]=u;
return true;
}
}
}
return false;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int x,y; cin>>x>>y;
g[x][y]=1;
}
int ans=0;
memset(pre,-1,sizeof(pre));
for(int u=1;u<=n;u++){
memset(used,0,sizeof(used));
if(dfs(u)){
ans++;
}
}
cout<<ans<<endl;
}
5.https://ac.nowcoder.com/acm/problem/20483
#include<bits/stdc++.h>
using namespace std;
const int maxn=67;
int n;
int st[maxn],home[maxn],a[maxn][maxn];
int vis[maxn];
int link1[maxn];
inline bool dfs(int x){
for(int i=1;i<=n;i++){
if(vis[i]==0 && a[x][i]==1 && st[i]==1){
vis[i]=1;
if(link1[i]==0 || ((dfs(link1[i])))){
link1[i]=x;
return 1;
}
}
}
return 0;
}
inline void sol(){
cin>>n;
memset(st,0,sizeof(st));
memset(home,0,sizeof(home));
memset(a,0,sizeof(a));
memset(link1,0,sizeof(link1));
for(int i=1;i<=n;i++){
cin>>st[i];
}
for(int i=1;i<=n;i++){
cin>>home[i];
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++){
a[i][i]=1;
}
bool flag=1;
for(int i=1;i<=n;i++){
if(st[i]==0 || (st[i]==1 && home[i]==0)){
memset(vis,0,sizeof(vis));
if (dfs(i)==0){
flag=0;
break;
}
}
}
if(flag==1){
cout<<"^_^"<<endl;
}
else{
cout<<"T_T"<<endl;
}
}
int main(){
int T;cin>>T;
while(T--){
sol();
}
}