二分图以及强联通分量,割点,割边代码展示

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();
    }
}
posted @ 2025-07-15 23:48  fufufuf  阅读(4)  评论(0)    收藏  举报