(https://acm.ecnu.edu.cn/contest/173/problem/C/)

题目大意:

小花梨给出?个点,让?位同学对这?个点任意添加无向边,构成?张图。小花梨想知道对于每个点?,存在多少个点?(包括?本身),使得?和?在这?张图中都是连通的。

题解:

  • 直接DFS、BFS或者并查集对每张图进行连通块染色, 两个点在k张图中都相邻说明这两个点在k张图的染色 都是一样的
  • map<vector< int >,int>存下每个点在k张图的颜色序列出现的次数即可。

DFS(深搜):

/*AC 1.008*/
#include<iostream>
#include<vector>
#include<map>
const int MAX=1e5+10;
using namespace std;
int nowcolor,n,k;
bool book[MAX];
vector<int>G[MAX];
vector<int>color[MAX];
map<vector<int>,int>Map;
void dfs(int i)
{book[i]=1;color[i].push_back(nowcolor);for(int j=0;j<G[i].size();j++)if(!book[G[i][j]])dfs(G[i][j]);
}
int main()
{ios::sync_with_stdio(false);cin.tie(0);cin>>n>>k;while(k--){for(int w=1;w<=n;w++)G[w].clear(),book[w]=0;int a,u,v;cin>>a;for(int i=1;i<=a;i++)cin>>u>>v,G[u].push_back(v),G[v].push_back(u);nowcolor=0;for(int i=1;i<=n;i++)if(!book[i])nowcolor++,dfs(i);}for(int i=1;i<=n;i++)Map[color[i]]++;for(int i=1;i<=n;i++)cout<<Map[color[i]]<<endl;return 0;
}

BFS(广搜):

/*AC 0.739*/
#include<bits/stdc++.h>
#define _ ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
using namespace std;
const int MAX=1e5+10;
vector<int>G[MAX];
vector<int>color[MAX];
int que[MAX];
map<vector<int>,int>Map;
bool book[MAX];
int main()
{_int n,k;cin>>n>>k;while(k--){for(int i=1;i<=n;i++)G[i].clear(),book[i]=0;int a,u,v,nowcolor;cin>>a;for(int i=1;i<=a;i++)cin>>u>>v,G[u].push_back(v),G[v].push_back(u);nowcolor=0;for(int i=1;i<=n;i++){if(!book[i]){nowcolor++;int head=1,tail=1;que[tail++]=i;book[i]=1;color[i].push_back(nowcolor);while(head<tail/*&&tail<=n*/){int t=que[head];for(int j=0;j<G[t].size();j++){if(!book[G[t][j]]){que[tail++]=G[t][j];book[G[t][j]]=1;color[G[t][j]].push_back(nowcolor);}//if(tail>n)break;}head++;}}}}for(int i=1;i<=n;i++)Map[color[i]]++;for(int i=1;i<=n;i++)cout<<Map[color[i]]<<endl;return 0;
}

并查集:

/*AC 0.345*//*(以下代码借鉴自其他博客)*/
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;
typedef long long ll;
const int N=1e5+20;
vector<int>zu[N];
map<vector<int>,int>mp;
int pre[N],num[N];
int find(int x)//并查集的查操作
{if(pre[x]==x)return x;return pre[x]=find(pre[x]);
}
void merge(int x,int y)//并查集的并操作
{int fx=find(x);int fy=find(y);if(fx!=fy){if(num[fx]>num[fy]){pre[fy]=fx;num[fx]+=num[fy];}else{pre[fx]=fy;num[fy]+=num[fx];}}return;
}
int main()
{int n,k;scanf("%d%d",&n,&k);for(int z=0;z<k;z++)//依次处理k张图,正在处理的图记为第z张图 {for(int i=1;i<=n;i++)//并查集初始化 {pre[i]=i;num[i]=1;}int m,x,y;scanf("%d",&m);for(int i=0;i<m;i++)//m个边 {scanf("%d%d",&x,&y);merge(x,y);}for(int i=1;i<=n;i++)//将每个点的第z个祖先push_back到zu[i]的vector中 zu[i].push_back(find(i));}for(int i=1;i<=n;i++)//用map统计完全相同的zu[i]的个数 mp[zu[i]]++;for(int i=1;i<=n;i++)//输出完全相同的zu[i]的个数,即和点i在k张图中都全连通的点的数量 printf("%d\n",mp[zu[i]]);return 0;
}

小花梨判连通(DFS或BFS或并查集+vector+map)——“美登杯”上海市高校大学生程序设计邀请赛 (华东理工大学)相关推荐

  1. “美登杯”上海市高校大学生程序设计邀请赛 (华东理工大学)E. 小花梨的数组

    题目链接:https://acm.ecnu.edu.cn/contest/173/problem/E/ 题意:Description 小花梨得到了一个长度为?的数组?,现在要对它进行三种操作: ⚫ 1 ...

  2. “美登杯”上海市高校大学生程序设计邀请赛 **D. 小花梨的取石子游戏**

    "美登杯"上海市高校大学生程序设计邀请赛 (华东理工大学) D. 小花梨的取石子游戏 Description 小花梨有?堆石子,第?堆石子数量为??,?堆石子顺时针编号为1 − ? ...

  3. “美登杯”上海市高校大学生程序设计邀请赛(华东理工大学) 小花梨的取石子游戏(博弈)

    Description 小花梨有?堆石子,第?堆石子数量为??,?堆石子顺时针编号为1 − ?(如图) . 游戏将进行?轮,每轮游戏单独进行,互不干扰,每轮初始时第?堆石子数目为??. 第?轮从编号为 ...

  4. 美登杯”上海市高校大学生程序设计邀请赛 Problem E 、 小 花梨 的数组 (线段树)...

    Problem E E . 小 花梨 的数组 时间限制:1000ms 空间限制:512MB Description 小花梨得到了一个长度为?的数组?,现在要对它进行三种操作: ⚫ 1 ? ] ∗ ⚫ ...

  5. “美登杯”上海市高校大学生程序设计 C. 小花梨判连通 (并查集+map)

    Problem C C . 小 花梨 判连通 时间限制:2000ms 空间限制:512MB Description 小花梨给出?个点,让?位同学对这?个点任意添加无向边,构成?张图.小花梨想知道对于 ...

  6. “美登杯”上海市高校大学生程序设计赛B. 小花梨的三角形(模拟,实现)

    题目链接:https://acm.ecnu.edu.cn/contest/173/problem/B/#report9 Problem B B . 小 花梨 的 三角形 时间限制:1000ms 空间限 ...

  7. 上海市高校大学生程序设计邀请赛 C:小花梨判连通

    上海市高校大学生程序设计邀请赛 C:小花梨判连通 Problem C.小花梨判连通 时间限制:2000ms 空间限制:512MB Description 小花梨给出?个点,让?位同学对这?个点任意添加 ...

  8. C. 小花梨判连通(图的搜索)(map)

    Description 小花梨给出?个点,让?位同学对这?个点任意添加无向边,构成?张图.小花梨想知道对于 每个点?,存在多少个点?(包括?本身),使得?和?在这?张图中都是连通的. Input 第一 ...

  9. 图中连通块的个数:并查集

    图的连通性问题 在地图上有若干城镇(点),已知所有有道路直接相连的城镇对.要解决整幅图的连通性问题.比如,随意给你两个点,让你判断它们是否连通:或者问你整幅图一共有几个连通块,也就是被分成了几个互相独 ...

最新文章

  1. 根据镜像安装oracle插件,docker镜像alpine中安装oracle客户端
  2. java 线程相关的属性介绍
  3. C# 多线程 线程池(ThreadPool) 2 如何控制线程池?
  4. 我这么讲线索二叉树,我三岁大的表弟笑了笑
  5. [html] http中的301、302、307、308有什么区别?
  6. 和华为杯_2019全国大学生物联网设计竞赛(华为杯)拉开序幕
  7. 【CCF】201812-2小明放学
  8. Linux查看和控制进程
  9. RAID(冗余硬盘阵列)
  10. 彩色图+车牌颜色测试结果分析
  11. Pulseaudio之模式设置(二十一)
  12. ACM 学习笔记(三) 数学入门
  13. 用Python解决简单的水果分类问题(二)
  14. SDU创新实训 6.实现中文拼音模糊匹配
  15. foobox 3.8(foobar2000 CUI配置)
  16. LimeSDR官方系列教程(三):一个实际测试例子
  17. CDH下关于用户权限问题:Error while processing statement:xxxxxxThe directory must be owned by the submitte....
  18. 计算机考研402,2021双非无项目科班402分上岸中科大-数学经验+复试全过程
  19. 如何调用阿里云、百度云API接口
  20. 析达芬奇DM644x平台ARM中断处理流程

热门文章

  1. 暗恋如烟花,绚烂也落寞
  2. JSON简介:什么是JSON?
  3. (导数)微分与积分的概念
  4. 全球与中国老年人代步车市场深度研究分析报告
  5. 高中数学知识点-高考回归课本的100个问题(实用干货)
  6. python计算圆柱体积_用Python怎么用类的方法计算圆柱的表面积和体积,麻烦帮我写出代码,谢谢...
  7. 融汇云仓团队:有效任务已达9000+,感谢支持
  8. 方差、标准差和协方差三者之间的定义与计算
  9. 腾讯云服务器网站504,使用腾讯、百度云CDN现403和504错误的解决及使用CDN踩的坑...
  10. 中国十大虚拟主机服务商