https://acm.ecnu.edu.cn/contest/173/problem/C/
联通块染色,若i,j满足题目中的条件,那么他们在每幅图中的染色情况相同,即hash值相同
使用unsigned long long hash 自动对2^64取模;
#include<bits/stdc++.h> using namespace std; const int mod=1e9+7; const int M=1e5+5; vector<int>e[11][M]; unsigned long long c[11][M],hashh,ans[M]; int vis[M],col; map<unsigned long long ,int>sign; void dfs(int deep,int now){ if(vis[now]) return ; vis[now]=1; c[deep][now]=col; for(int i=0;i<e[deep][now].size();i++){ dfs(deep,e[deep][now][i]); } } int main(){ int n,m; scanf("%d%d",&n,&m); for(int i=0;i<m;i++){ int k; scanf("%d",&k); for(int j=0;j<k;j++){ int x,y; scanf("%d%d",&x,&y); e[i][x].push_back(y); e[i][y].push_back(x); } col=0; memset(vis,0,sizeof(vis)); for(int p=1;p<=n;p++){ if(vis[p]) continue; col++; dfs(i,p); } } for(int i=1;i<=n;i++){ hashh=0; for(int j=0;j<m;j++) hashh=hashh*mod+c[j][i]; sign[hashh]++; ans[i]=hashh; } for(int i=1;i<=n;i++) cout<<sign[ans[i]]<<endl; return 0; }