当前位置: 首页 > news >正文

二分图相关

·判断二分图(染色)

#include<bits/stdc++.h>
using namespace std;
void __p(int x) {cerr<<x;}
void __p(long long x){cerr<<x;}
void __p(long double x){cerr<<x;}
void __p(double x){cerr<<x;}
void __p(string s){cerr<<s;}
void __p(char s){cerr<<s;}
void _print(){cerr<<"]\n";}
template<typename T,typename... V>//定义类模版
void _print(T t,V... v){__p(t);if(sizeof...(v))cerr<<",";_print(v...);}
#define debug(x...) cerr<<"["<<#x<<"] = ["; _print(x);
#define see1 cout<<"-------------\n";
#define see2 cerr<<"-------------\n";
#define io ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define int long long 
#define double long double
#define sqrt sqrtl
/*

1.进行移位运算时, 1LL<<n ,1后面不要忘了LL否则会溢出
2.数组开太大放到外面,作为全局数组
3.dfs递归深度超过几千层可能会溢出

*/
const int N=2e5+10;
int a[N],n,m,vis[N],f=1;
vector<int>g[N];

void dfs(int x){
    for(auto y:g[x]){
        if(vis[y]==0){
            a[y]=(a[x]^1);
            vis[y]=1;
            dfs(y);
        }else if((a[y]^1)!=a[x]){
            // debug(x,y);
            f=0; return; 
        }
    }
}

void solve()
{
    cin>>n>>m;
    vector<int>a(m+10),b=a;

    for(int i=1;i<=m;i++){
        cin>>a[i];
    }
    for(int i=1;i<=m;i++){
        cin>>b[i];
    }
    for(int i=1;i<=m;i++){
        int x=a[i];
        int y=b[i];
        g[x].push_back(y);
        g[y].push_back(x);
    }
    for(int i=1;i<=n;i++){
        if(!vis[i])
        dfs(i);
    }
    if(f)
    cout<<"Yes";
    else
    cout<<"No";

  
}

signed main()
{
    io
    int t=1;
    // cin>>t; 
    while(t--){
        solve();
    }
}

 

· 妙妙构造

 

#include<bits/stdc++.h>
using namespace std;
void __p(int x) {cerr<<x;}
void __p(long long x){cerr<<x;}
void __p(long double x){cerr<<x;}
void __p(double x){cerr<<x;}
void __p(string s){cerr<<s;}
void __p(char s){cerr<<s;}
void _print(){cerr<<"]\n";}
template<typename T,typename... V>//定义类模版
void _print(T t,V... v){__p(t);if(sizeof...(v))cerr<<",";_print(v...);}
#define debug(x...) cerr<<"["<<#x<<"] = ["; _print(x)
#define see1 cout<<"-------------\n";
#define see cerr<<"-------------\n";
#define io ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define int long long 
#define double long double
#define sqrt sqrtl
const int inf = 8e18;
const int N=2e5+10;
vector<pair<int,int>>g[N];
int p[N],tot,n,m,a[N],d[N],cnt[2],vis[N];

void dfs(int u){
    p[++tot]=u;
    for(auto [v,w]:g[u]){
        if(!vis[v]){
            vis[v]=1;
            d[v]=(d[u]^w);
            dfs(v);
        }else if(d[v]!=(d[u]^w)){
            cout<<-1;
            exit(0);
        }
    }
}

void solve(){
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        int u,v,w; 
        cin>>u>>v>>w;
        g[u].push_back({v,w});
        g[v].push_back({u,w});
    }
    for(int i=1;i<=n;i++){
        if(!vis[i]){
            vis[i]=1;
            tot=0;
            dfs(i);
            for(int k=0;k<30;k++){
                cnt[0]=cnt[1]=0;
                for(int j=1;j<=tot;j++){
                    cnt[((d[p[j]]>>k)&1)]++;
                }
                if(cnt[1]>cnt[0])
                a[i]+=(1<<k);
            }
            for(int j=1;j<=tot;j++){
                a[p[j]]=(a[i]^d[p[j]]);
            }
        }
    }
    for(int i=1;i<=n;i++)
    cout<<a[i]<<' ';


}
signed main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int t=1;
    //  cin>>t;
    while(t--){
        solve();
    }
}

 ·确保图是二分图的情况下添边

 

#include<bits/stdc++.h>
using namespace std;
const int N=120;
int c[N],n;
vector<int>g[N];

void dfs(int u,int fa){
    for(auto v: g[u]){
        if(v==fa) continue;
        c[v]=(c[u]^1);
        dfs(v,u);
    }
}

signed main(){
    cin>>n;
    for(int i=1;i<n;i++){
        int x,y; cin>>x>>y; 
        g[x].push_back(y);
        g[y].push_back(x);
    }

    dfs(1,-1);

    set<pair<int,int>>s;

    // for(int i=1;i<=n;i++)
    // cout<<c[i]<<' ';
    // cout<<endl;

    for(int i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++){
            if(c[i]==c[j]) continue;
            s.insert({i,j});
            // cerr<<i<<' '<<j<<endl;
        }
    }
    for(int i=1;i<=n;i++){
        for(auto j: g[i]){
            if(j<i) continue;
            s.erase({i,j});
        }
    }

    if(s.size()&1){
        cout<<"First"<<endl;
        while(1){
            cout<<s.begin()->first<<' '<<s.begin()->second<<endl;
            s.erase(s.begin());
            int x,y; 
            cin>>x>>y; 
            if(x==-1) break;
            s.erase({x,y});
        }
    }else{
        cout<<"Second"<<endl;
        while(1){
            int x,y;
            cin>>x>>y; 
            if(x==-1) break;
            s.erase({x,y});
            cout<<s.begin()->first<<' '<<s.begin()->second<<endl;
            s.erase(s.begin());            
        }
    }

}

 25/3/24

相关文章:

  • 03 Python 基础:数据类型、运算符与流程控制解析
  • AIP-180 向后兼容
  • 统计矩的高阶推广:经验还是理论推导?
  • 计算图(Computation Graph)
  • git revert 用法实战:撤销一个 commit 或 merge
  • Go常见问题与回答(下)
  • 数据可视化革命!「图表狐」五大行业新范式:从科研论文到商业决策的AI进化论
  • 软件公司高新技术企业代办:机遇与陷阱并存-优雅草卓伊凡
  • ETL 自动化:提升数据处理效率与准确性的核心驱动力
  • 小红书 web x-s x-t X-Mns 分析
  • 行业分析---小米汽车2024全年财报
  • 基于Docker的OpenObserve快速搭建实现全链路可观测性远程管理
  • ZLinq:意在替代Linq的高性能.Net开源库
  • STM32/GD32主要学习内容
  • Python应用指南:利用高德地图API获取POI数据(关键词版)
  • 日常学习开发记录-select组件(2)
  • 【stm32】用从模式控制器 完成PWM的测量
  • Haption力反馈遥操作机器人:6自由度高精度技术,定义远程操作新标准
  • [特殊字符] 力扣热题 394:字符串解码(详细解析)(Go语言版)
  • C++ :顺序容器
  • 中国证券监督管理委员会党委委员、副主席王建军接受审查调查
  • 刘国中:毫不松懈巩固拓展脱贫攻坚成果,全力以赴抓好农业防灾减灾工作
  • 投资者建议发行优惠套票给“被套”小股东,张家界:将研究考虑
  • 小核酸药物企业瑞博生物递表港交所,去年亏损2.81亿元
  • 宁波市纪委监委通报4起违反中央八项规定精神典型问题
  • 举牌超200轮!中铁建7.76亿元竞得北京通州梨园宅地