您的位置:首页 > Web前端

hdu 5486 Difference of Clustering

2015-09-28 21:47 357 查看
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstring>
#include<vector>
#include<map>

using namespace std;
const int mx=1000000+1000;
typedef long long ll;
int T,n,deg[mx*2];
map<int,int> mp1,mp2;
vector<int> g[mx*2];
void init()
{
mp1.clear();
mp2.clear();
for(int i=0;i<=n*2+1000;i++) g[i].clear();
}
int main()
{
cin>>T;int kase=0;
while(T--)
{
cin>>n;
int nk=0,ok=0,od,nw;
init();
for(int i=0;i<n;i++)
{
scanf("%d%d",&od,&nw);
if(mp1.count(od)==0) mp1[od]=ok++;
if(mp2.count(nw)==0) mp2[nw]=nk++;
od=mp1[od];nw=mp2[nw]+n+100;
g[od].push_back(nw);
g[nw].push_back(od);
}
for(int i=0;i<ok;i++)
{
sort(g[i].begin(),g[i].end());
g[i].erase( unique(g[i].begin(), g[i].end() ), g[i].end()  ) ;
}
for(int ii=0;ii<nk;ii++)
{
int i=ii+n+100;
sort(g[i].begin(),g[i].end());
g[i].erase( unique(g[i].begin(), g[i].end() ), g[i].end()  ) ;
}
int ans1=0,ans2=0,ans3=0;
for(int i=0;i<ok;i++)
{
if(g[i].size()==1)
{
int v=g[i][0];
if(g[v].size()==1) ans3++;
}
else if(g[i].size()>1)
{
int cnt=0;
for(int j=0;j<g[i].size();j++)
{
int v=g[i][j];
if(g[v].size()==1) continue;
cnt++;
}
if(cnt==0)
ans1++;
}
}
for(int i=0;i<nk;i++)
{
int ii=i+n+100;
if(g[ii].size()>1)
{
int cnt=0;
for(int j=0;j<g[ii].size();j++)
{
int v=g[ii][j];
if(g[v].size()==1) continue;
cnt++;
}
if(cnt==0)
ans2++;
}
}
printf("Case #%d: %d %d %d\n",++kase,ans1,ans2,ans3);
}
return 0;
}

此题本是水题,不过题意有些深奥,我到现在都不是很明白,看了别人的博客自己写了一下。

首先是离散然后建一个图,用个STL里的unique'去掉重边,最后统计一下便OK。

比赛的时候读了半天题完全没有搞懂,一群人问admin,啥也不hui,好坑,就差这一题就可以晋级了......
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: