Difference of Clustering

给定10^6个关系

现在要求从左到右1对多,多对1,1:1的情况的数量

HDU 5486(Difference of Clustering-聚类)_i++

但是n:n的情况要排除

HDU 5486(Difference of Clustering-聚类)_c++_02

直接离散,求连通块

#include<bits/stdc++.h>
using namespace std;
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
typedef long long ll;

int u[MAXN],v[MAXN],n,a[MAXN];
map<int,int> h;

int sz;
bool b[MAXN];
int cal1,cal2;

class link_table
{
public:
void mem()
{
MEM(pre) MEM(edge) MEM(pre) size=1;
}
int edge[MAXM],next[MAXM],pre[MAXN],size;

void addedge(int u,int v)
{
edge[++size]=v;
next[size]=pre[u];
pre[u]=size;
}
void addedge2(int u,int v){addedge(u,v);addedge(v,u);}


void dfs(int x)
{
b[x]=1;
if (x<=n) ++cal1;else ++cal2;
Forp(x) {
int v=edge[p];
if (!b[v]) dfs(v);
}

}
}St;
int main()
{
freopen("C.in","r",stdin);
// freopen(".out","w",stdout);

int T; cin>>T;
For(kcase,T) {
int A=0,B=0,C=0;
cin>>n;
For(i,n) {
int x,y;
scanf("%d%d",&x,&y);
u[i]=x,v[i]=y;
}
sz=0;
For(i,n) a[++sz]=u[i],a[++sz]=v[i];
sort(a+1,a+1+sz);
sz=unique(a+1,a+1+sz)-(a+1);
h.clear();
For(i,sz) h[a[i]]=i;
For(i,n) u[i]=h[u[i]],v[i]=h[v[i]];

St.mem();
For(i,n)
{
St.addedge2(u[i],v[i]+n);
}
For(i,n*2) b[i]=0;
For(i,n*2) {
if (!b[i])
{
cal1=cal2=0;
St.dfs(i);
if (cal1==1&&cal2==1) C++;
else if (cal1==1&&cal2>1) A++;
else if (cal2==1&&cal1>1) B++;

}
}
printf("Case #%d: %d %d %d\n",kcase,A,B,C);
}


return 0;
}