【甘道夫】通过Mahout构建贝叶斯文本分类器案例详解

http://acm.hdu.edu.cn/showproblem.php?pid=1507

大致题意:在一个n*m的格子上,黑色的地方不可用,问在白色格子上最多可放多少1*2的矩阵。

思路:建图,每个白色格子与它临近的上下左右的白色格子建边,求最大匹配,答案为最大匹配/2,因为是双向图。最后输出匹配边时,当找到一组匹配边记得将该边标记,以防重复计算。

#include <stdio.h>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <math.h>
#include <string.h>
#include <queue>
#define LL long long
#define _LL __int64
using namespace std;
const int INF = 0x3f3f3f3f;
const int mod = 1000000007;
const int maxn = 110;

int n,m,k;
vector <int> edge[maxn];
int Map[maxn][maxn];
int match[10010],chk[10010];
int cnt;

int addre[10010];
void debug()
{
	for(int i = 1; i <= n; i++)
	{
		for(int j = 1; j <= m; j++)
			printf("%d%d ",Map[i][j],addre[Map[i][j]]);
		printf("\n");
	}
}
int dfs(int p)
{
    for(int i = 0; i < (int)edge[p].size(); i++)
    {
        int q = edge[p][i];
        if(!chk[q])
        {
            chk[q] = 1;
            if(match[q] == -1 || dfs(match[q]))
            {
                match[q] = p;
                return 1;
            }
        }
    }
    return 0;
}

void output()
{
	int vis[10010];
	int x,y,xx,yy,tmp;
	memset(vis,0,sizeof(vis));

	for(int i = 1; i <= cnt; i++)
	{
		if(match[i] != -1 && !vis[i])
		{
			tmp = match[i];
			if(!vis[tmp] && i != tmp)
			{
				vis[i] = 1;
				vis[tmp] = 1;
				xx = addre[tmp]/m+1;
				yy = addre[tmp]%m+1;
				x = addre[i]/m+1;
				y = addre[i]%m+1;
				printf("(%d,%d)--(%d,%d)\n",x,y,xx,yy);
			}
		}
	}
}

int main()
{
    int u,v;
    while(~scanf("%d %d",&n,&m) && (n || m))
    {
        for(int i = 1; i <= n*m; i++)
            edge[i].clear();
        memset(Map,-1,sizeof(Map));
        scanf("%d",&k);

        for(int i = 0; i < k; i++)
        {
            scanf("%d %d",&u,&v);
            Map[u][v] = 0;
        }

        cnt = 0;
        int tmp = -1;
        for(int i = 1; i <= n; i++)
        {
            for(int j = 1; j <= m; j++)
            {
            	tmp++;
                if(Map[i][j] < 0)
                {
                    cnt++;
                    addre[cnt] = tmp;
                    Map[i][j] = cnt;
                }
            }
        }
        //debug();

        for(int i = 1; i <= n; i++)
        {
            for(int j = 1; j <= m; j++)
            {
                if(Map[i][j] == 0) continue;
                if(i-1 >= 1 && Map[i-1][j]>0)
                    edge[Map[i][j]].push_back(Map[i-1][j]);
                if(i+1 <= n && Map[i+1][j]>0)
                    edge[Map[i][j]].push_back(Map[i+1][j]);
                if(j-1 >= 1 && Map[i][j-1]>0)
                    edge[Map[i][j]].push_back(Map[i][j-1]);
                if(j+1 <= m && Map[i][j+1]>0)
                    edge[Map[i][j]].push_back(Map[i][j+1]);
            }
        }

        memset(match,-1,sizeof(match));
        int ans = 0;
        for(int i = 1; i <= cnt; i++)
        {
            memset(chk,0,sizeof(chk));
            ans += dfs(i);
        }
        printf("%d\n",ans/2);
		output();
    }

    return 0;
}

【甘道夫】通过Mahout构建贝叶斯文本分类器案例详解

时间: 2024-10-11 12:37:57

【甘道夫】通过Mahout构建贝叶斯文本分类器案例详解的相关文章

【甘道夫】通过Mahout构建贝叶斯文本分类器案例具体解释

背景&目标: 1.sport.tar 是体育类的文章,一共同拥有10个类别. 用这些原始材料构造一个体育类的文本分类器,并測试对照bayes和cbayes的效果: 记录分类器的构造过程和測试结果. 2.user-sport.tar 是用户浏览的文章,每一个目录相应一个用户. 利用上题构造的文本分类器,计算每一个用户浏览各类文章的占比. 记录计算过程和结果. 实验环境: Hadoop-1.2.1 Mahout0.6 Pig0.12.1 Ubuntu12 Jdk1.7 原理&流程 建立文本分类

【甘道夫】Mahout推荐算法编程实践

引言 Taste是曾经风靡一时的推荐算法框架,后来被并入Mahout中,Mahout的部分推荐算法基于Taste实现. 下文介绍基于Taste实现最常用的UserCF和ItemCF. 本文不涉及UserCF和ItemCF算法的介绍,这方面网上资料很多,本文仅介绍如何基于Mahout编程实现. 欢迎转载,请注明来源: http://blog.csdn.net/u010967382/article/details/39183839 步骤一:构建数据模型 UserCF和ItemCF算法的输入数据是用户

朴素贝叶斯文本分类(详解)

from numpy import zeros,array from math import log def loadDataSet(): #词条切分后的文档集合,列表每一行代表一个email postingList=[['your','mobile','number','is','award','bonus','prize'], ['new','car','and','house','for','my','parents'], ['my','dalmation','is','so','cute

【甘道夫】用贝叶斯文本分类测试打过1329-3.patch的Mahout0.9 on Hadoop2.2.0

引言 接前一篇文章<[甘道夫]Mahout0.9 打patch使其支持 Hadoop2.2.0> http://blog.csdn.net/u010967382/article/details/39088035, 为Mahout0.9打过Patch编译成功后,使用贝叶斯文本分类来测试Mahout0.9对Hadoop2.2.0的兼容性. 欢迎转载,转载请注明出处: http://blog.csdn.net/u010967382/article/details/39088285 步骤一:将20ne

【甘道夫】通过Mahout构建推荐系统--通过IDRescorer扩展评分规则

通过Mahout构建推荐系统时,假设我们须要添?某些过滤规则(比方:item的创建时间在一年以内),则须要用到IDRescorer接口,该接口源代码例如以下: package org.apache.mahout.cf.taste.recommender; /** * <p> * A {@link Rescorer} which operates on {@code long} primitive IDs, rather than arbitrary {@link Object}s. * Thi

【甘道夫】并行化频繁模式挖掘算法FP Growth及其在Mahout下的命令使用

今天调研了并行化频繁模式挖掘算法PFP Growth及其在Mahout下的命令使用,简单记录下试验结果,供以后查阅: 环境:Jdk1.7 + Hadoop2.2.0单机伪集群 +  Mahout0.6(0.8和0.9版本都不包含该算法.Mahout0.6可以和Hadoop2.2.0和平共处有点意外orz) 部分输入数据,输入数据一行代表一个购物篮: 4750,19394,25651,6395,5592 26180,10895,24571,23295,20578,27791,2729,8637 7

【甘道夫】HBase基本数据操作详解【完整版,绝对精品】

引言 之前详细写了一篇HBase过滤器的文章,今天把基础的表和数据相关操作补上. 本文档参考最新(截止2014年7月16日)的官方Ref Guide.Developer API编写. 所有代码均基于"hbase 0.96.2-hadoop2"版本编写,均实测通过. 欢迎转载,请注明来源: http://blog.csdn.net/u010967382/article/details/37878701 概述 对于建表,和RDBMS类似,HBase也有namespace的概念,可以指定表空

【甘道夫】Mahout0.9 打patch使其支持 Hadoop2.2.0

引言 Mahout0.9之前的版本默认不支持Hadoop2.2.0以上版本,但很多情况下,由于集群环境的Hadoop已经是2.2.0以上版本,又必须使用Mahout,此时就需要编译源码,使得Mahout支持Hadoop2了. 欢迎转载,请注明出处: http://blog.csdn.net/u010967382/article/details/39088035 造好的车轮 让Mahout在Hadoop2.2.0上运行是需求十分广泛的,所以必定有前人已经栽好树了,我们可以在 https://iss

【甘道夫】Hadoop2.2.0环境使用Sqoop-1.4.4将Oracle11g数据导入HBase0.96,并自动生成组合行键

目的: 使用Sqoop将Oracle中的数据导入到HBase中,并自动生成组合行键! 环境: Hadoop2.2.0 Hbase0.96 sqoop-1.4.4.bin__hadoop-2.0.4-alpha.tar.gz Oracle11g jdk1.7 Ubuntu14 Server 这里关于环境吐槽一句: 最新版本的Sqoop1.99.3功能太弱,只支持导入数据到HDFS,没有别的任何选项,太土了!(如有不同意见欢迎讨论给出解决方案) 命令: sqoop import --connect