PAT A 1107. Social Clusters (30)

来源:互联网 发布:倒计时软件安卓 编辑:程序博客网 时间:2024/06/05 01:54
/*这个是个图的题目,不过并不是个典型的图的数据结构,主要考的就是数据结构的建立,只要建模的方式选得恰当算法主体就是很简单的一个DFS,可用并查集,但我没用。pl[I]里面存放的都是拥有ith-hobby的所有人的序号,hby[j]里面存的是对于jth人,其所有的hobby序号。关键在于本题所定义的连通图是为所有找拥有部分共同爱好的人都在一个cluster里面,即不要求cluster里面所有的人都有同一个hobby,例如样例中第二个cluster人数为3,因为第3个人和第5个人共有3th-hobby,而第7个人和第3个人共有5th-hobby,所有他们三个人为一个cluster。*/
#include <cstdio>#include <vector>#include <algorithm>using namespace std;vector<int> pl[1002],hby[1002],res;bool visited[1002]={false};bool cmp(const int &a,const int &b){return a>b;}void DFS(const int &v,int &count){if(!visited[v]){visited[v]=true; ++count;for(int c:hby[v]){//c表示第v个人的每一个hobby序号for(int d:pl[c])if(!visited[d])DFS(d,count);//对v来说,其所有拥有和其同一个序号的人都和他为一个cluster}}}void DFS_traverse(const int &n){for(int i=1;i<=n;++i){if(!visited[i]){int count=0;DFS(i,count);res.push_back(count);}}} int main(void){//freopen("in.log","r",stdin);int n;scanf("%d",&n);for(int i=1;i<=n;++i){int hnum;scanf("%d: ",&hnum);while(hnum--){int hid;scanf("%d",&hid);hby[i].push_back(hid);pl[hid].push_back(i);}}DFS_traverse(n);sort(res.begin(),res.end(),cmp);int size=res.size();printf("%d\n",size);for(int c:res)(--size)?printf("%d ",c):printf("%d",c);return 0;}

原创粉丝点击