• 【二分匹配】【匈牙利算法即由增广路求最大匹配模板】


    基本思想:先初始化匹配M为空,找到图中的一条相对于M的增广路P。对P上的路径取反,更新M,。再次寻找增广路,若不存在增广路算法结束。(有一点点稍微难理解,自己手动模拟一下这个过程就知道啦)


    #include<stdio.h>
    #include<string.h>
    #define N 101
    int book[N],match[N];
    int e[N][N];
    int n,m;
    int dfs(int u)
    {
    	int i;
    	for(i = 1; i <= n; i ++)
    	{
    		if(!book[i]&&e[u][i])
    		{
    			book[i] = 1;//标记点i已经访问过 
    			if(!match[i]||dfs(match[i]))//如果标记点i没有配对,或者找到了新的配对 
    			{
    				match[i] = u;//更新配对关系 
    				return 1;
    			}
    		}
    	}
    	return 0;
    }
    int main()
    {
    	int i,j,sum,t1,t2;
    	while(scanf("%d%d",&n,&m)!=EOF)
    	{
    		for(i = 1; i <= m; i ++)
    		{
    			scanf("%d%d",&t1,&t2);
    			e[t1][t2] = 1;//这里是有向图 
    		}
    		memset(match,0,sizeof(match));
    		sum = 0; 
    		for(i = 1; i <= n; i ++)
    		{//清空上一次搜索时的标记 
    			memset(book,0,sizeof(book));
    			if(dfs(i))//寻找增广路,如果找到,配对数加1 
    				sum ++;
    		}
    		printf("%d
    ",sum);//输出配对数 
    	 } 
    	return 0;
    }






  • 相关阅读:
    echarts数据可视化之简单使用范例,
    配置用户/系统环境变量的意义与方法
    关于百度echarts数据可视化js插件基本使用样例
    python 博客引用
    泛型
    Java 关键字
    java基本知识点5
    Java 序列化
    java知识点4
    前端知识点总结1
  • 原文地址:https://www.cnblogs.com/hellocheng/p/7350053.html
Copyright © 2020-2023  润新知