小花梨判连通 (bfs+思维+map统计数量)
如果两个集合存储颜色的情况相同,说明这两个在k个图中都是在一个集合的
学到的点:用map,将vector映射一个整数时,只有vector后面的邻接的数据都一样时,才认为两个vector一样
代码:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<stack> #include<map> #include<set> #include<vector> #include<cmath> const int maxn=1e5+5; typedef long long ll; using namespace std; vector<int>Map[maxn]; vector<int>Color[maxn]; int n,k; map<vector<int>,int>mp; int vis[maxn]; int cnt; void bfs(int x) { vis[x]=1; Color[x].push_back(cnt); for(int t=0;t<Map[x].size();t++) { if(vis[Map[x][t]]==0) { bfs(Map[x][t]); } } } int main() { scanf("%d%d",&n,&k); for(int t=0;t<k;t++) { int x; scanf("%d",&x); for(int t=1;t<=n;t++) { Map[t].clear(); vis[t]=0; } for(int j=0;j<x;j++) { int u,v; scanf("%d%d",&u,&v); Map[u].push_back(v); Map[v].push_back(u); } cnt=0; for(int t=1;t<=n;t++) { if(vis[t]==0) { cnt++; bfs(t); } } } for(int t=1;t<=n;t++) { mp[Color[t]]++; //如果两个集合存储颜色的情况相同,说明这两个在k个图中都是在一个集合的 } for(int t=1;t<=n;t++) { printf("%d\n",mp[Color[t]]); } return 0; }
作者:李斌
-------------------------------------------
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!
万水千山总是情,打赏一分行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主,哈哈哈(っ•̀ω•́)っ✎⁾⁾!
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步