版权声明:https://blog.csdn.net/huashuimu2003 https://blog.csdn.net/huashuimu2003/article/details/84501153
标题
描述 Description
警察抓到了n个罪犯,警察根据经验知道他们属于不同的犯罪团伙,却不能判断有多少个团伙,但通过警察的审讯,知道其中的一些罪犯之间相互认识,已知同一犯罪团伙的成员之间直接或间接认识,有可能一个犯罪团伙只有一个人。请你根据已知罪犯之间的关系,确定犯罪团伙的数量。已知罪犯的编号从1至n。
输入格式 Input Format
第一行:n(<10000,罪犯数量)。
第二行:m(<50000,关系数量)。
以下m行,每行两个数:i 和j,中间一个空格隔开,表示罪犯i和罪犯j相互认识。
输出格式 Output Format
一个整数,犯罪团伙的数量。
样例输入 Sample Input
11
8
1 2
4 5
3 4
1 3
5 6
7 10
5 10
8 9
样例输出 Sample Output
3
样例说明:共三个集团。
时间限制 Time Limitation
1s
注释 Hint
1s
小数据版:dfs+邻接矩阵
#include<bits/stdc++.h>
using namespace std;
const int maxnum = 5100;
int n, m, ans, a[maxnum][maxnum];
bool v[maxnum];
inline int read()
{
int f=1,num=0;
char ch=getchar();
while (ch<'0'||ch>'9') { if (ch=='-') f=-1; ch=getchar(); }
while (ch>='0'&&ch<='9') { num=(num<<1)+(num<<3)+ch-'0'; ch=getchar(); }
return num*f;
}
void dfs(int s)
{
for (int i =1; i <= n; i++)
if ((a[s][i]) && (!v[i]))
{
v[i]=1;
dfs(i);
}
}
int main()
{
n=read(),m=read();
memset(v, 0, sizeof(v));
memset(a, 0, sizeof(a));
for (int i = 1; i <= m; i++)
{
int x = read(), y = read();
a[x][y] = a[y][x] = 1;
}
for (int i = 1; i <= n; i++)
if (!v[i])
{
v[i] = 1;
dfs(i);
ans++;
}
cout<<ans<<endl;
return 0;
}
大数据版:dfs+邻接矩阵
#include<bits/stdc++.h>
using namespace std;
const int maxnum = 510000;
int n, m, tot, ans, head[maxnum], ver[maxnum], next[maxnum], que[maxnum];
bool v[maxnum];
void add(int x, int y)
{
ver[++tot] = y,next[tot] = head[x],head[x] = tot;
}
void init()
{
cin>> n>> m;
memset(head, 0, sizeof(head));
memset(next, 0, sizeof(next));
memset(ver, 0, sizeof(ver));
memset(v, 0, sizeof(v));
for (int i = 1; i <= m; i++)
{
int a, b;
cin>>a>>b;
add(a, b),add(b, a);
}
}
void dfs(int s)
{
for (int i = head[s]; i; i = next[i])
if (!v[ver[i]])
{
v[ver[i]]=1;
dfs(ver[i]);
}
}
int main()
{
ios::sync_with_stdio(false);
init();
for (int i = 1; i <= n; i++)
if (!v[i])
{
v[i]=1;
dfs(i);
ans++;
}
cout<<ans<<endl;
return 0;
}
超大数据版:bfs+邻接矩阵
#include<bits/stdc++.h>
using namespace std;
const int maxnum = 510000;
int n, m, ans, tot;
bool v[maxnum];
int head[maxnum], que[maxnum], ver[maxnum], next[maxnum], tails = 1;
inline void add(int x, int y)
{
tot++;
ver[tot] = y;
next[tot] = head[x];
head[x] = tot;
return;
}
void init()
{
cin >> n >> m;
memset(head, 0, sizeof(head));
memset(next, 0, sizeof(next));
memset(ver, 0, sizeof(ver));
memset(v, 0, sizeof(v));
for(int i = 1; i <= m; i++)
{
int a, b;
cin >> a >> b;
add(a, b);
add(b, a);
}
return;
}
void BFS(int s)
{
v[s] = 1;
memset(que, 0, sizeof(que));
tails = 1;
que[1] = s;
for(int i = 1; i <= tails; i++)
for(int j = head[que[i]]; j; j = next[j])
if(!v[ver[j]])
{
que[++tails] = ver[j];
v[ver[j]] = 1;
}
return;
}
int main()
{
ios::sync_with_stdio(false);
init();
for(int i = 1; i <= n; i++)
if( !v[i] )
{
BFS(i);
ans++;
}
cout << ans << endl;
return 0;
}
然而某位大佬直接用了并查集干掉了三道题。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。我规规矩矩的打了一个下午啊