小花梨判连通(DFS或BFS或并查集+vector+map)——“美登杯”上海市高校大学生程序设计邀请赛 (华东理工大学)
(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)——“美登杯”上海市高校大学生程序设计邀请赛 (华东理工大学)相关推荐
- “美登杯”上海市高校大学生程序设计邀请赛 (华东理工大学)E. 小花梨的数组
题目链接:https://acm.ecnu.edu.cn/contest/173/problem/E/ 题意:Description 小花梨得到了一个长度为?的数组?,现在要对它进行三种操作: ⚫ 1 ...
- “美登杯”上海市高校大学生程序设计邀请赛 **D. 小花梨的取石子游戏**
"美登杯"上海市高校大学生程序设计邀请赛 (华东理工大学) D. 小花梨的取石子游戏 Description 小花梨有?堆石子,第?堆石子数量为??,?堆石子顺时针编号为1 − ? ...
- “美登杯”上海市高校大学生程序设计邀请赛(华东理工大学) 小花梨的取石子游戏(博弈)
Description 小花梨有?堆石子,第?堆石子数量为??,?堆石子顺时针编号为1 − ?(如图) . 游戏将进行?轮,每轮游戏单独进行,互不干扰,每轮初始时第?堆石子数目为??. 第?轮从编号为 ...
- 美登杯”上海市高校大学生程序设计邀请赛 Problem E 、 小 花梨 的数组 (线段树)...
Problem E E . 小 花梨 的数组 时间限制:1000ms 空间限制:512MB Description 小花梨得到了一个长度为?的数组?,现在要对它进行三种操作: ⚫ 1 ? ] ∗ ⚫ ...
- “美登杯”上海市高校大学生程序设计 C. 小花梨判连通 (并查集+map)
Problem C C . 小 花梨 判连通 时间限制:2000ms 空间限制:512MB Description 小花梨给出?个点,让?位同学对这?个点任意添加无向边,构成?张图.小花梨想知道对于 ...
- “美登杯”上海市高校大学生程序设计赛B. 小花梨的三角形(模拟,实现)
题目链接:https://acm.ecnu.edu.cn/contest/173/problem/B/#report9 Problem B B . 小 花梨 的 三角形 时间限制:1000ms 空间限 ...
- 上海市高校大学生程序设计邀请赛 C:小花梨判连通
上海市高校大学生程序设计邀请赛 C:小花梨判连通 Problem C.小花梨判连通 时间限制:2000ms 空间限制:512MB Description 小花梨给出?个点,让?位同学对这?个点任意添加 ...
- C. 小花梨判连通(图的搜索)(map)
Description 小花梨给出?个点,让?位同学对这?个点任意添加无向边,构成?张图.小花梨想知道对于 每个点?,存在多少个点?(包括?本身),使得?和?在这?张图中都是连通的. Input 第一 ...
- 图中连通块的个数:并查集
图的连通性问题 在地图上有若干城镇(点),已知所有有道路直接相连的城镇对.要解决整幅图的连通性问题.比如,随意给你两个点,让你判断它们是否连通:或者问你整幅图一共有几个连通块,也就是被分成了几个互相独 ...
最新文章
- 根据镜像安装oracle插件,docker镜像alpine中安装oracle客户端
- java 线程相关的属性介绍
- C# 多线程 线程池(ThreadPool) 2 如何控制线程池?
- 我这么讲线索二叉树,我三岁大的表弟笑了笑
- [html] http中的301、302、307、308有什么区别?
- 和华为杯_2019全国大学生物联网设计竞赛(华为杯)拉开序幕
- 【CCF】201812-2小明放学
- Linux查看和控制进程
- RAID(冗余硬盘阵列)
- 彩色图+车牌颜色测试结果分析
- Pulseaudio之模式设置(二十一)
- ACM 学习笔记(三) 数学入门
- 用Python解决简单的水果分类问题(二)
- SDU创新实训 6.实现中文拼音模糊匹配
- foobox 3.8(foobar2000 CUI配置)
- LimeSDR官方系列教程(三):一个实际测试例子
- CDH下关于用户权限问题:Error while processing statement:xxxxxxThe directory must be owned by the submitte....
- 计算机考研402,2021双非无项目科班402分上岸中科大-数学经验+复试全过程
- 如何调用阿里云、百度云API接口
- 析达芬奇DM644x平台ARM中断处理流程
热门文章
- 暗恋如烟花,绚烂也落寞
- JSON简介:什么是JSON?
- (导数)微分与积分的概念
- 全球与中国老年人代步车市场深度研究分析报告
- 高中数学知识点-高考回归课本的100个问题(实用干货)
- python计算圆柱体积_用Python怎么用类的方法计算圆柱的表面积和体积,麻烦帮我写出代码,谢谢...
- 融汇云仓团队:有效任务已达9000+,感谢支持
- 方差、标准差和协方差三者之间的定义与计算
- 腾讯云服务器网站504,使用腾讯、百度云CDN现403和504错误的解决及使用CDN踩的坑...
- 中国十大虚拟主机服务商