题目
n个人参加某项特殊考试。
为了公平,要求任何两个认识的人不能分在同一个考场。
求是少需要分几个考场才能满足条件。
输入格式
第一行,一个整数n(1<n<100),表示参加考试的人数。
第二行,一个整数m,表示接下来有m行数据
以下m行每行的格式为:两个整数a,b,用空格分开 (1<=a,b<=n) 表示第a个人与第b个人认识。
输出格式
一行一个整数,表示最少分几个考场。
样例输入
5
8
1 2
1 3
1 4
2 3
2 4
2 5
3 4
4 5
样例输出
4
样例输入
5
10
1 2
1 3
1 4
1 5
2 3
2 4
2 5
3 4
3 5
4 5
样例输出
5
解题思路
1:用对称矩阵存储考生之间的关系
2:dfs算法(用函数独立模块)
输入:进入考场的人数 x ,这个人还没进时的考场数 kes
运用了递归回溯。
注意点①
if (kes >= min_kes)//防止回溯时的错误
{
return;
}
注意点②
if (x > n)//递归结束的条件
{
min_kes = kes;
return;
}
源代码
#include<stdio.h>
#include<stdlib.h>
int map[100][100];//考场和座位
int relation[100][100];//考生关系
int min_kes, n;//最小考场数,人数
void DFS(int x, int kes)//待进场人数,考场数
{
int i;
if (kes >= min_kes)//防止回溯时的错误
{
return;
}
if (x > n)//递归结束的条件
{
min_kes = kes;
return;
}
for (i = 0; i < kes; i++)//判断与前面进来的是否有关系
{
int k=0;
while (map[i][k] && !relation[x][map[i][k]])
{
k++;
}
if (!map[i][k])
{
map[i][k] = x;
DFS(x + 1, kes);
}
}
map[kes][0] = x;
DFS(x + 1, kes + 1);
}
int main()
{
int t, a, b;//t,关系的次数,a,b,a与b有关系
scanf_s("%d%d", &n, &t);
min_kes = n;
while (t--)//输入关系
{
scanf_s("%d%d", &a, &b);
relation[a][b] = relation[b][a] = 1;
}
DFS(1, 0);
printf("%d", min_kes);
system("pause");
return 0;
}