Difference of Clustering HDU - 5486

题意:有n个实体,新旧两种聚类算法,每种算法有很多聚类,在同一算法里,一个实体只属于一个聚类,然后有以下三种模式。

第一种分散,新算法的某几个聚类是旧算法某个聚类的真子集。

第二种聚合,旧算法的某几个聚类是新算法某个聚类的真子集。

第三种1:1,新算法的某个聚类跟旧算法某个聚类相同。

问每种模式存在多少个?

实路上很明了,就是模拟,而且每个实体最多遍历到一次,所以时间上不用担心。

先把聚类的编号hash,把每个实体分配到相应的聚类里,然后遍历新算法的所有聚类,再遍历每个聚类里的每个实体,用set保存这个实体相应的旧算法的聚类。

然后就是分情况讨论,如果set里的元素大于1,很明显就是分散,我们遍历set里的旧算法的聚类,然后遍历实体,看实体的编号是不是都对应当前遍历的新算法的编号

如果set里元素刚好是1,就看这个唯一对应的旧算法的聚类大小,如果等于当前遍历的新算法的大小,就是1:1了,否则我们考虑聚合的情况,处理跟分散差不多

遍历这个旧算法的聚类里的实体,用set保存这个实体相应的新算法的聚类,遍历set里的新算法的聚类,然后遍历实体,看实体的编号是不是都对应这个旧算法的编号

这里要注意的就是标记一下遍历的新算法的聚类的编号,然后后面遍历到这个聚类直接跳过就行。

具体实现上,stl用的好的话很好实现的,需要注意的就是内存的问题。clear是不会清空内存的,所有会超内存,所以用swap,

还有二维vector,vector<int> pp1[N],pp2[N]这样开的话也会超内存,改成vector< vector<int> > 动态分配内存就OK了。

主要是想保存一些这个swap和二维vector降低内存的方法,还有无序map。解法的话网上有个思路,把给出的关系转换成图,然后dfs判断点的度数就行了。

 #include<cstdio>
#include<tr1/unordered_map>
#include<vector>
#include<set>
using namespace std;
typedef long long ll;
const int N=1e6+;
const ll M=1e10+;
tr1::unordered_map<ll,int> mmp;
vector< vector<int> > pp1,pp2;//记录相应的聚类里的实体
set<int> temp;
bool vis[N];
int match1[N],match2[N];//记录实体对应的聚类
int main(){
int t=,T,n,cnt1,cnt2,id1,id2;
ll c1,c2;
scanf("%d",&T);
while(t<=T){
cnt1=cnt2=;
tr1::unordered_map<ll,int>().swap(mmp);
vector< vector<int> >().swap(pp1);
vector< vector<int> >().swap(pp2);
pp1.push_back(vector<int>());
pp2.push_back(vector<int>());
scanf("%d",&n);
for(int i=;i<=n;i++) vis[i]=false;
for(int i=;i<=n;i++){
scanf("%lld%lld",&c1,&c2);
c2+=M;
if(!mmp[c1]) mmp[c1]=++cnt1;
if(!mmp[c2]) mmp[c2]=++cnt2;
id1=mmp[c1];id2=mmp[c2];
if(cnt1>=(int)pp1.size())
pp1.push_back(vector<int>());
if(cnt2>=(int)pp2.size())
pp2.push_back(vector<int>());
pp1[id1].push_back(i);
pp2[id2].push_back(i);
match1[i]=id1;
match2[i]=id2;
}
int ans1=,ans2=,ans3=;
for(int i=;i<=cnt1;i++){
if(vis[i]) continue;
set<int>().swap(temp);
for(int j=;j<(int)pp1[i].size();j++)
temp.insert(match2[pp1[i][j]]);
if((int)temp.size()>){
bool flag=true;
for(set<int>::iterator it=temp.begin();it!=temp.end()&&flag;it++){
id2=*it;
for(int k=;k<(int)pp2[id2].size()&&flag;k++){
id1=pp2[id2][k];
if(match1[id1]!=i) flag=false;
}
}
if(flag) ans1++;
}else{
id2=*temp.begin();
if((int)pp2[id2].size()!=(int)pp1[i].size()){
set<int>().swap(temp);
for(int j=;j<(int)pp2[id2].size();j++){
id1=pp2[id2][j];
if(match1[id1]!=i) temp.insert(match1[id1]);
}
bool flag=true;
for(set<int>::iterator it=temp.begin();it!=temp.end();it++){
id1=*it;
vis[id1]=true;
for(int k=;k<(int)pp1[id1].size();k++){
int id3=pp1[id1][k];
if(match2[id3]!=id2){
flag=false;
break;
}
}
}
if(flag) ans2++;
}else ans3++;
}
}
printf("Case #%d: %d %d %d\n",t++,ans1,ans2,ans3);
}
return ;
}

stl好啊

HDU 5486 Difference of Clustering 暴力模拟的更多相关文章

  1. HDU 5486 Difference of Clustering 图论

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5486 题意: 给你每个元素一开始所属的集合和最后所属的集合,问有多少次集合的分离操作,并操作和不变操 ...

  2. HDU 5489 Difference of Clustering 图论

    Difference of Clustering Problem Description Given two clustering algorithms, the old and the new, y ...

  3. HDU 5683 zxa and xor 暴力模拟

    zxa and xor 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5683 Description zxa had a great interes ...

  4. bnuoj 20832 Calculating Yuan Fen(暴力模拟)

    http://www.bnuoj.com/bnuoj/problem_show.php?pid=20832 [题意]: 给你一串字符串,求一个ST(0<ST<=10000),对字符串中字符 ...

  5. POJ 1013 小水题 暴力模拟

    Counterfeit Dollar Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 35774   Accepted: 11 ...

  6. HDU 5487 Difference of Languages(BFS)

    HDU 5487 Difference of Languages 这题从昨天下午2点开始做,到现在才AC了.感觉就是好多题都能想出来,就是写完后debug很长时间,才能AC,是不熟练的原因吗?但愿孰能 ...

  7. hdu_1006 Tick and Tick(暴力模拟)

    hdu1006 标签(空格分隔): 暴力枚举 好久没有打题了,退队了有好几个月了,从心底不依赖那个人了,原来以为的爱情戏原来都只是我的独角戏.之前的我有时候好希望有个人出现,告诉自己去哪里,做什么,哪 ...

  8. HDU 2920 分块底数优化 暴力

    其实和昨天写的那道水题是一样的,注意爆LL $1<=n,k<=1e9$,$\sum\limits_{i=1}^{n}(k \mod i) = nk - \sum\limits_{i=1}^ ...

  9. hihoCoder #1871 : Heshen's Account Book-字符串暴力模拟 自闭(getline()函数) (ACM-ICPC Asia Beijing Regional Contest 2018 Reproduction B) 2018 ICPC 北京区域赛现场赛B

    P2 : Heshen's Account Book Time Limit:1000ms Case Time Limit:1000ms Memory Limit:512MB Description H ...

随机推荐

  1. Python爬虫—requests库get和post方法使用

    目录 Python爬虫-requests库get和post方法使用 1. 安装requests库 2.requests.get()方法使用 3.requests.post()方法使用-构造formda ...

  2. 为什么我们需要Pod?(容器设计模式sidecar)

    Pod,是 Kubernetes 项目中最小的 API 对象 容器的本质是进程,就是未来云计算系统中的进程:容器镜像就是这个系统里的".exe"安装包 Kubernetes 就是操 ...

  3. Docker学习+遇坑笔记

    基础命令: 1.Docker启动:docker-machine start default 2.Docker关闭:  docker-machine stop default 3.查看当前运行的Dock ...

  4. BFS以及hash表判重的应用~

    主要还是讲下hash判重的问题吧 这道题目用的是除法求余散列方式 前几天看了下算法导论 由于我们用的是线性再寻址的方式来解决冲突问题 所以hash表的大小(余数的范围)要包含我们要求的范围 对mod的 ...

  5. SSE指令集加速之 I420转BGR24

    void yuv420_to_rgb24_sse3(uint8_t *yp, uint8_t *up, uint8_t *vp, int sy, int suv, int width, int hei ...

  6. 关于Mybatis的几件小事(一)

    一.Mybatis简介 1.Mybatis简介 MyBatis是支持定制化SQL.存储过程以及高级映射的优秀的持久层框架. MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集. M ...

  7. C++ STL 之 容器的深拷贝和浅拷贝

    如果我们没有提供拷贝构造函数,没有重载=操作符,vector 对我们的 mc 对象进行的简单的浅拷贝,将拷贝的对象插入到容器中,导致我们的 mc 对象的 data 指针和容器中mc 对象的拷贝对象中的 ...

  8. python实现IP地址转换为32位二进制

    python实现IP地址转换为32位二进制 #!/usr/bin/env python # -*- coding:utf-8 -*- class IpAddrConverter(object): de ...

  9. shiro系列三、ssm框架整合shiro实现权限控制

    shiro权限框架是一个非常优秀的框架,前面的几篇文章对shiro进行了非常详细的介绍和原理分析,那么接下来让我们开始在web项目中使用它(javase也能用shiro): 一.数据库表结构设计 二. ...

  10. 前端基础(八):Font Awesome(图标)

    一.font awesome简介 目前图标总数共有519个; 不依赖Javascript 矢量图形,无限缩放 免费,可用于商业 CSS控制样式,自定义图标颜色,大小,阴影,一切可能实现的效果 支持re ...