// UVa 1197 - The Suspects
#include <iostream>
#include <map>
#include <vector>
#include <string.h>
#include <queue>
using namespace std;
#define MaxM 500
#define MaxN 30000
int main() {
int m, n;
while (cin >> n >> m && (m || n)) {
// initialize data structures
map<int, bool> group_map[MaxM];
vector<int> group_members[MaxM];
vector<int> member_groups[MaxN];
bool lnk[MaxM][MaxM];
memset(lnk, false, sizeof(lnk));
// read all groups
for (int i = 0; i < m; i++) {
int k;
for (cin >> k; k; k--) {
// read member of this group
int a;
cin >> a;
// create links to other groups
for (int j = 0; j < member_groups[a].size(); j++) {
lnk[i][member_groups[a][j]] = true;
lnk[member_groups[a][j]][i] = true;
}
// update data structures
group_map[i][a] = true;
group_members[i].push_back(a);
member_groups[a].push_back(i);
}
}
// queue groups infected by student 0
int sol;
bool yet[MaxM];
memset(yet, true, sizeof(yet));
queue<int> q;
for (int i = 0; i < m; i++)
if (group_map[i][0]) {
q.push(i);
yet[i] = false;
}
if (!q.empty()) {
// flood fill
while (!q.empty()) {
int now = q.front();
q.pop();
for (int i = 0; i < m; i++)
if (lnk[now][i] && yet[i]) {
q.push(i);
yet[i] = false;
}
}
// count members
sol = 0;
bool counted[MaxN];
memset(counted, false, sizeof(counted));
for (int i = 0; i < m; i++)
if (!yet[i]) {
for (int j = 0; j < group_members[i].size(); j++)
if (!counted[group_members[i][j]]) {
counted[group_members[i][j]] = true;
sol++;
}
}
} else
sol = 1;
cout << sol << endl;
}
return 0;
}
Saturday, June 13, 2015
UVa 1197 - The Suspects
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment