#include <iostream> #include <queue> using namespace std; int connection1[4][4] = {{1,0,1,1},{0,1,0,0},{1,0,1,1},{1,0,1,1}}; int connection2[4][4] = {{1,0,0,0},{0,1,0,0},{0,0,1,0},{0,0,0,1}};
//深度优先 void dfs(int array[4][4], int *flag, int pos) { ? ? for (int i = 0; i < 4; i++) ? ? { ? ? ? ? if (array[pos][i] == 1 && *(flag + i) == 0) ? ? ? ? { ? ? ? ? ? ? *(flag + i) = 1; ? ? ? ? } ? ? } }
int countObjects1(int array[4][4]) { ? ? int flag[4] = {0}; ? ? int num = 0; ? ? for (int i = 0; i < 4; i++) ? ? { ? ? ? ? if (flag[i] == 0) ? ? ? ? { ? ? ? ? ? ? dfs(array, flag, i); ? ? ? ? ? ? num++; ? ? ? ? } ? ? } ? ?? ? ? return num; }
//广度优先 void bfs(int array[4][4], int *flag, int pos) { ? ? queue<int> q; ? ? q.push(pos); ? ? while(!q.empty()) ? ? { ? ? ? ? int tmp = q.front(); ? ? ? ? q.pop(); ? ? ? ? *(flag + tmp) = 1; ? ? ? ? for (int i = 0; i < 4; i++) ? ? ? ? { ? ? ? ? ? ? if (*(flag + i) == 0 && array[tmp][i] == 1) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? q.push(i); ? ? ? ? ? ? } ? ? ? ? } ? ? } }
int countObjects2(int array[4][4]) { ? ? int flag[4] = {0}; ? ? int num = 0; ? ? for (int i = 0; i < 4; i++) ? ? { ? ? ? ? if (flag[i] == 0) ? ? ? ? { ? ? ? ? ? ? bfs(array, flag, i); ? ? ? ? ? ? num++; ? ? ? ? } ? ? } ? ?? ? ? return num; }
//并查集 int find(int *flag, int pos) { ? ? if (flag[pos] == pos) ? ? { ? ? ? ? return pos; ? ? } ? ?? ? ? flag[pos] = find(flag, flag[pos]); ? ? return flag[pos]; }
void link(int array[4][4], int *flag, int *level, int pos1, int pos2) { ? ? int p1 = find(flag, pos1); ? ? int p2 = find(flag, pos2); ? ?? ? ? if (p1 == p2) ? ? { ? ? ? ? return; ? ? } ? ?? ? ? if (level[p1] > level[p2]) ? ? { ? ? ? ? flag[p2] = p1; ? ? } ? ? else if (level[p1] < level[p2]) ? ? { ? ? ? ? flag[p1] = p2; ? ? } ? ? else ? ? { ? ? ? ? flag[p1] = p2; ? ? ? ? level[p2] += 1; ? ? } ? ?? ? ? return; }
int countObjects3(int array[4][4]) { ? ? int level[4] = {0}; ? ? int flag[4] = {0}; ? ? for (int i = 0; i < 4; i++) ? ? { ? ? ? ? flag[i] = i; ? ? ? ? level[i] = 1; ? ? } ? ? ? ?? ? ? for (int i = 0; i < 4; i++) ? ? ? ? for (int j = i; j < 4; j++) ? ? ? ? { ? ? ? ? ? ? if (array[i][j] == 1) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? link(array, flag, level, i, j); ? ? ? ? ? ? } ? ? ? ? } ? ?? ? ? int num = 0; ? ? for (int i = 0; i < 4; i++) ? ? { ? ? ? ? if (i == flag[i]) ? ? ? ? ? ? num++; ? ? } ? ?? ? ? return num; }
int main() { ?? ?cout ?<< countObjects1(connection1) << endl; ?? ?cout ?<< countObjects1(connection2) << endl; ?? ? ?? ?cout ?<< countObjects2(connection1) << endl; ?? ?cout ?<< countObjects2(connection2) << endl; ?? ? ?? ?cout ?<< countObjects3(connection1) << endl; ?? ?cout ?<< countObjects3(connection2) << endl; ?? ? ?? ?return 0; }
|