社区讨论
求条
UVA1627Team them up!参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mhjshrzr
- 此快照首次捕获于
- 2025/11/04 07:47 4 个月前
- 此快照最后确认于
- 2025/11/04 07:47 4 个月前
CPP
#include <bits/stdc++.h>
using namespace std;
int g[1010][1010], f[1010][1010], n;
int color[1010], cnt;
vector<int>vct[1010][4];
int from[1010][1010], xuan[1010][1010];
bool flag=false;
void dfs(int u, int col, int fa) {
color[u] = col;
f[cnt][col]++;
vct[cnt][col].push_back(u);
for (int i = 1; i <= n; ++i) {
if(flag)return ;
if (!g[i][u] && u != i && i != fa) {
if (color[u] == color[i]) {
flag=true;
puts("No solution");
return ;
} else if (!color[i]) {
dfs(i, 3 - col, u);
}
}
}
}
int ans;
int v[1010];
int f2[1010][1010];
int T;
int main() {
cin>>T;
while(T--){
flag=false;
scanf("%d", &n);
ans=0;
memset(g, 0, sizeof(g));
memset(color, 0, sizeof(color));
cnt = 0;
memset(f, 0, sizeof(f));
memset(f2, 0, sizeof(f2));
memset(xuan, 0, sizeof(xuan));
memset(from, 0, sizeof(from));
memset(v, 0, sizeof(v));
for (int i = 1; i <= n; ++i) {
int x = -1;
while (x != 0) {
scanf("%d", &x);
g[i][x] = 1;
}
}
for (int i = 1; i <= n; ++i) {
for (int j = i + 1; j <= n; ++j)
if (!(g[i][j] && g[j][i]))
g[i][j] = g[j][i] = 0;
}
// memset(color,-1,sizeof(color));
for (int i = 1; i <= n; ++i) {
if (!color[i]) {
cnt++;
dfs(i, 2, 0);
if(flag)break;
}
}
if(flag)continue;
f2[0][0] = 1;
for (int i = 1; i <= cnt; ++i) {
for (int j = 0; j <= n / 2; ++j) {
if (j >= f[i][1] && f2[i - 1][j - f[i][1]]) {
f2[i][j] = 1;
xuan[i][j] = 1;
from[i][j] = j - f[i][1];
}
if (j >= f[i][2] && f2[i - 1][j - f[i][2]]) {
f2[i][j] = 1;
xuan[i][j] = 2;
from[i][j] = j - f[i][2];
}
// if (j >= f[i][1] && f[i - 1][j - f[i][1]]) {
// f[i][j] = 1;
// xuan[i][j] = 1;
// from[i][j] = j - f[i][1];
// }
// if (j >= f[i][2] && f[i - 1][j - f[i][2]]) {
// f[i][j] = 1;
// xuan[i][j] = 2;
// from[i][j] = j - f[i][2];
// }
}
}
for (int i = n / 2; i >= 1; --i) {
if (f2[cnt][i]) {
ans = i;
break;
}
}
cout << ans << ' ';
int i = cnt, j = ans;
while (i > 0 && j > 0) {
int col = xuan[i][j];
for (int k = 0; k < vct[i][col].size(); k++) {
v[vct[i][col][k]] = true;
}
j = from[i--][j];
}
for (i = 1; i <= n; ++i)
if (v[i])
printf("%d ", i);
puts("");
cout << n - ans << ' ';
for (int i = 1; i <= n; ++i)
if (!v[i])
printf("%d ", i);
puts("");
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...