p1206 ~p1208 犯罪团伙

版权声明: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;
}

然而某位大佬直接用了并查集干掉了三道题。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。我规规矩矩的打了一个下午啊

猜你喜欢

转载自blog.csdn.net/huashuimu2003/article/details/84501153
今日推荐