这题本身不难,但是因为刚开始想偷懒,卡在vector引用导致的问题上很久很久。。。
这里的n到100了,不能用动态规划做着色的方法做了,用dfs可以做。从第一个人开始一个个人考虑,要么自己单独开一个考场,要不加入已有的考场(如果能加进去的话)。
#include<bits/stdc++.h>
using namespace std;
int n, m;
int a[105][105];
int best = 105, cur = 0;
vector<vector<int> >all;
void dfs(int u) {
if (u == n + 1) {
best = min(best, (int)all.size());
return;
}
if (all.size() >= best) return;
for (int i = 0; i<all.size(); ++i) {
bool ok = true;
for (int j = 0; j<all[i].size(); ++j) {
if (a[u][all[i][j]]) {
ok = false;
break;
}
}
if (ok) {
all[i].push_back(u);
dfs(u + 1);
all[i].pop_back();
}
}
vector<int> t;
t.push_back(u);
all.push_back(t);
dfs(u + 1);
all.pop_back();
}
int main()
{
int d, c;
//freopen("input1.txt", "r", stdin);
scanf("%d%d", &n, &m);
for (int i = 0; i<m; ++i) {
scanf("%d%d", &c, &d);
a[c][d] = a[d][c] = 1;
}
dfs(1);
cout << best;
return 0;
}
vector引用的坑
最开始为了写起来方便点,写了个vector<int> &v = all[i]
,然后用v代替了all[i],这样就不停地报vector empty before pop。但是在算法含义上它们明明是一样的。。。。
原因:vector是动态分配内存的,不够的话加倍当前容量。所以如果给v赋值all[i]之后,all又push_back了新的值,那v指向的内存就可能没意义了。
所以,用引用来偷懒的方法只能用在int[][][]这样的数组中。
具体例子
int main()
{
vector<int> tt({ 2,3 }), kk({ 2 });
all.push_back(tt);
vector<int> &r = all[0];
all.push_back(kk); //执行完这步后看看r
return 0;
}