zoukankan      html  css  js  c++  java
  • 二分图匹配

    使用了匈牙利算法(就是暴力)

    具体思路还是友链吧

    这是大佬

    这是我基佬然而他是一位htlm选手。所以看他的blog会很卡

    我就是想解释一下vis数组的意义~~可能有纰漏o( ̄▽ ̄)d ~~

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<vector>
    using namespace std;
    int read()
    {
        int s=0;
        char in=getchar();
        while(in<'0'||in>'9')
    		in=getchar();
        while(in>='0'&&in<='9')
    	{
            s=(s<<3)+(s<<1)+in-'0';
            in=getchar();
        }
        return s;
    }
    //bool map[1010][1010];//用的是邻接表
    vector<int>rel[1010];
    int pat[1010];
    bool vis[1010];
    int n,m,e;
    bool dfs(int x)
    {
    	for(int i=0;i<rel[x].size();i++)
    	if(!vis[rel[x][i]])//如果他没有被尝试匹配
    	{
    		vis[rel[x][i]]=true;//已尝试匹配,为什么这里一定要被变为true呢?
                    //如果这个点可以霸占他,一定是要被标记的。如果不能的话。说明这个点已经名花有主了,所以也要被标记
    		if(!pat[rel[x][i]]||dfs(pat[rel[x][i]]))
    		{
    			pat[rel[x][i]]=x;
    			return true;
    		}
    	}
    	return false;
    }
    int main()
    {
    	n=read();
    	m=read();
    	e=read();
    	int a,b;
    	for(int i=1;i<=e;i++)
    	{
    		a=read();
    		b=read();
    		if(a<=n&&b<=m)
    			//map[a][b]=true;
    			rel[a].push_back(b);
    	}
    	int ans=0;
    	for(int i=1;i<=n;i++)
    	{
    		memset(vis,false,sizeof(vis));
    		if(dfs(i))
    			ans+=1;
    	}
    	printf("%d",ans);
    }
    
  • 相关阅读:
    iOS面试题
    iOS-block
    iOS开发设计模式
    iOS-宏定义
    正则表达式(转)
    iOS-textfield控制光标开始位置
    initWithNibName&initWithCoder &awakeFromNib&UIView常见属性方法
    iOS应用生命周期
    iOS-app发布新版本步骤
    iOS从App跳转至系统设置菜单各功能项
  • 原文地址:https://www.cnblogs.com/Lance1ot/p/8845815.html
Copyright © 2011-2022 走看看