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

Problem C、小花梨判连通

时间限制:2000ms 空间限制:512MB

Description

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

Input

第一行输入两个正整数??和??,分别表示点的个数和同学数。
接下来分成??部分进行输入,每部分输入格式相同。
每部分第一行输入一个整数????,表示第??位同学连边的数目。
接下来????行,每行两个正整数??, ??,表示第??位同学将点??和点??之间进行连接。
可能会存在重边或者自环。
(1 ≤ ?? ≤ 100000,1 ≤ ?? ≤ 10,1 ≤ ??, ?? ≤ ??, 0 ≤ ???? ≤ 200000)

Output

输出??行,第??行输出在??张图中都和编号为??的点连通的点的数目(包括??本身)
Example

Sample Input

4 2
3
1 2
1 3
2 3
2
1 2
3 4

Sample Output

2
2
1
1

对每一个图dfs求联通块并染色,处于同一个联通块中的点染成相同的颜色。染色之后对于图中的每一个点就有一个长度为k的颜色序列,两点在k张图中均联通即两个点的颜色序列完全相同。求每个点的颜色序列的hash值,并记录每种hash值出现了多少次。输出答案时将该点对应的hash值出现的次数输出即可。

#include "bits/stdc++.h"

using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int maxn = 1e5 + 100;
const int inf = 0x3f3f3f3f;
bool vis[maxn];
vector<int> e[11][maxn];
unsigned long long ans[maxn];
int c[11][maxn];
int col = 0;
map<unsigned long long, int> mp;

void dfs(int deep, int now) {
    if (vis[now]) return;
    c[deep][now] = col;
    vis[now] = true;
    for (auto p:e[deep][now]) {
        dfs(deep, p);
    }
}

int main() {
    //freopen("in.txt", "r", stdin);
    int n, k, m;
    scanf("%d %d", &n, &k);
    int u, v;
    for (int i = 0; i < k; i++) {
        cin >> m;
        for (int j = 0; j < m; j++) {
            scanf("%d %d", &u, &v);
            e[i][u].push_back(v);
            e[i][v].push_back(u);
        }
        col = 0;
        memset(vis, 0, sizeof(vis));
        for (int j = 1; j <= n; j++) {
            if (!vis[j]) col++;
            dfs(i, j);
        }
    }
    unsigned long long hash;
    for (int i = 1; i <= n; i++) {
        hash = 0;
        for (int j = 0; j < k; j++) {
            hash = hash * mod + c[j][i];
        }
        mp[hash]++;
        ans[i] = hash;
    }
    for (int i = 1; i <= n; i++) {
        cout << mp[ans[i]] << endl;
    }
    return 0;
}

原文地址:https://www.cnblogs.com/albert-biu/p/10886808.html

时间: 2024-10-04 22:36:16

上海市高校大学生程序设计邀请赛 C:小花梨判连通的相关文章

小花梨判连通 (bfs+思维+map统计数量)

如果两个集合存储颜色的情况相同,说明这两个在k个图中都是在一个集合的 学到的点:用map,将vector映射一个整数时,只有vector后面的邻接的数据都一样时,才认为两个vector一样 代码: #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<stack> #include<ma

FZU - 2039 Pets (二分图匹配 2011年全国大学生程序设计邀请赛(福州))

Description Are you interested in pets? There is a very famous pets shop in the center of the ACM city. There are totally m pets in the shop, numbered from 1 to m. One day, there are n customers in the shop, which are numbered from 1 to n. In order t

第一次组队赛---2010年全国大学生程序设计邀请赛(福州)L

L - Left Mouse Button Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice FZU 1920 Description Mine sweeper is a very popular small game in Windows operating system. The object of the game is to find mi

湖南省大学生程序设计竞赛系统设计

背景:本人一直学习DBA数据库维护技能,出于同学需要,充当数据库设计开发,第一次与同学一起完成了一套小型管理系统的设计开发.自己充当数据库设计者,记录下来自己作为留念.  (相关的UML图已省略) 一. 引言 1.1项目背景 湖南省每年都要举行大学生程序设计竞赛,每次竞赛时,由组委会发布竞赛要求,各大高校分别对自己学校的队伍进行报名. 传统的以人工方式为主进行该项赛事的报名工作,每年将耗费大量的人力物力,同时还伴随着各种突发问题.如果通过计算机网络将竞赛组委会和各大高校联系在一起,使用网络发布竞

第八届山东省ACM大学生程序设计竞赛个人总结

因为省赛,从开学紧张到5月7号.心思也几乎全放在ACM的训练上.因为我还是校台球协会的会长,所以台协还有一些事情需要忙,但是我都给延迟了.老会长一直在催我办校赛,但我一直说 等等吧,因为校赛只能在周六或周日举办,而我们的ACM组队集训也都在周六周日, 如果我去支持校赛的话,那么一整天的集训就浪费了.不止这样,前期的准备工作也挺耗时的.就这样,我到现在都还没举办校赛(打算定在5月14号,不过那天我得去清华参加一个ACM邀请赛,所以还是主持不了,得让副会长去主持了,因为这个比赛不能再推了,再下个周又

hdu 计算机学院大学生程序设计竞赛(2015’11)

搬砖 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submission(s): 5134    Accepted Submission(s): 1288 Problem Description 小明现在是人见人爱,花见花开的高富帅,整天沉浸在美女环绕的笙歌妙舞当中.但是人们有所不知,春风得意的小明也曾有着一段艰苦的奋斗史. 那时的小明还没剪去长发,没有信用卡没有她

HDU 5925 Coconuts 【离散化+BFS】 (2016CCPC东北地区大学生程序设计竞赛)

Coconuts Time Limit: 9000/4500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 524    Accepted Submission(s): 151 Problem Description TanBig, a friend of Mr. Frog, likes eating very much, so he always has dreams abou

[2012山东省第三届ACM大学生程序设计竞赛]——Fruit Ninja II

Fruit Ninja II 题目:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2416 Time Limit: 5000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 Have you ever played a popular game named "Fruit Ninja"? Fruit Ninja (known as Fruit Ninja

HDU 5961 传递 【图论+拓扑】 (2016年中国大学生程序设计竞赛(合肥))

传递 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)   Problem Description 我们称一个有向图G是传递的,当且仅当对任意三个不同的顶点a,,若G中有 一条边从a到b且有一条边从b到c ,则G中同样有一条边从a到c.我们称图G是一个竞赛图,当且仅当它是一个有向图且它的基图是完全图.换句 话说,将完全图每条边定向将得到一个竞赛图.下图展示的是一个有4个顶点的竞