如果两个集合存储颜色的情况相同,说明这两个在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; }
原文地址:https://www.cnblogs.com/Staceyacm/p/10887348.html
时间: 2024-11-02 15:47:26