码迷,mamicode.com
首页 > 其他好文 > 详细

FZU 2192 位置信息挖掘 (种类并查集)

时间:2015-06-20 14:19:48      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:acm   并查集   

题目链接click here~~

题目大意】:

O2O即Online To Offline,是指将线下的商务机会与互联网结合,让互联网成为线下交易的前台。这些商务机会主要是偏服务类的商品,例如汽车售后服务、摄影服务、餐饮、电影等,其特色是线上购买、线下服务。

因此,对这类垂直行业的商品做移动推荐时,用户和商品的位置信息显得格外重要。但是,可能存在用户、商品的位置信息缺失的情况,例如:用户不共享位置信息、商家未填写位置信息……

现在,Jason给出用户在移动端的购买行为数据,以及商品集合,希望能补全一些缺失的位置信息。为了简化问题,假设:

1、由于是服务类的商品,如果用户位于城市A,那么该用户只会购买位于城市A的商品。

2、数据不存在噪声,即测试数据都是合法的。

Input

包含多组数据

每组输入数据格式如下:

第一行,三个数:N、M、Q,表示N个商品,M条购买行为数据,Q个询问。

接下来N行,每行两个数:itemId、cityId,表示商家填写的服务itemId,位于城市cityId。

接下来M行,每行三个数:userId、itemId、cityId,表示用户userId购买了服务itemId,移动端定位城市cityId。

接下来Q行,每行两个数:0、itemId或者1、userId,表示询问服务itemId所在的城市,或者用户userId所在的城市。

注意:0表示位置信息缺失。

Output

每组输出数据格式如下: Q行,每行一个数:cityId,表示服务itemId位于cityId,或者用户userId位于cityId。

Sample Input

3 2 5
2 0
3 0
1 3
2 2 2
1 1 0
0 1
0 2
0 3
1 1
1 2

Sample Output

3
2
0
3
2
解题思路】:用到了并查集,开始直接用模拟去做,发现不能简单的去处理,所谓种类并查集,只是一个区别罢了,涉及到不同的种类对象,把需要处理的itemid和cityid用并查集合并起来,因为题目中确定两者一一对应的关系,然后我们去合并的时候注意要及时更新num[fy]=num[fx],具体看代码吧~~

代码:

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int N=1e5+10;
int fa[N];
int num[N];
int treeh[N];
int n,m,q,za,zb;
int itemid,cityid,usedid;
void init()
{
    for(int i=0; i<=n+m; ++i)
    {
        fa[i]=i;
        treeh[i]=num[i]=0;
    }
}
int find(int x)
{
    if(x==fa[x]) return x;
    else return fa[x]=find(fa[x]);
}
void unite(int x,int y,int d)//每次合并的时候更新num
{
   int fx=find(x);
   int fy=find(y);
   if(d) num[fx]=d;//注意更新
   fa[fx]=fy;
   if(num[fy]==0) num[fy]=num[fx];
}
int main()
{
    while(cin>>n>>m>>q)
    {
        init();
        for(int i=0; i<n; ++i)
        {
            cin>>itemid>>cityid;
            if(cityid) num[itemid]=cityid;
        }
        for(int i=0; i<m; ++i)
        {
            cin>>usedid>>itemid>>cityid;
            if(cityid) num[usedid+n]=cityid;
            unite(usedid+n,itemid,cityid);
        }
        while(q--)
        {
            cin>>za>>zb;
            if(za==0) cout<<num[find(zb)]<<endl;
            else cout<<num[find(zb+n)]<<endl;
        }
    }
    return 0;
}
/*
3 2 5
2 0
3 0
1 3
2 2 2
1 1 0
0 1
0 2
0 3
1 1
1 2
Sample Output
3
2
0
3
2
*/


FZU 2192 位置信息挖掘 (种类并查集)

标签:acm   并查集   

原文地址:http://blog.csdn.net/u013050857/article/details/46573283

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!