POJ_1112_Team Them Up!
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
#include <iostream>
#define inf 1000000
using namespace std;
const int MAXN = 101;
int map[MAXN][MAXN];
int id[2][MAXN];
int color[MAXN];
int dp[MAXN][MAXN];
int tmp[MAXN][MAXN];
struct
{
int c1, c2;
int i, j;
}pre[MAXN][MAXN];
int N, t;
bool DFS(int CurV, int c)
{
color[CurV] = c;
id[c%2][t]++;
bool ans = true;
for (int i = 1; i <= N; i++)
{
if (map[CurV][i] == 1)
{
if (color[i] == -1)
{
ans = DFS(i, (c%2==0)?(c+1):(c-1));
if (ans == false)
return false;
}
else if (color[i] == color[CurV])
return false;
}
}
return true;
}
int main()
{
freopen("test.txt", "r", stdin);
scanf("%d", &N);
memset(map, 0, sizeof(map));
memset(id, 0, sizeof(id));
memset(color, 0xff, sizeof(color));
memset(tmp, 0, sizeof(tmp));
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= N; i++)
{
int j;
while (scanf("%d", &j) != EOF && j != 0)
tmp[i][j] = 1;
}
for (int i = 1; i <= N; i++)
{
for (int j = i+1; j <= N; j++)
{
if (!(tmp[i][j] == 1 && tmp[j][i] == 1))
map[i][j] = map[j][i] = 1;
}
}
bool ans;
int c = 0;
t = 0;
for (int i = 1; i <= N; i++)
{
if (color[i] == -1)
{
ans = DFS(i, c);
c += 2;
t++;
if (ans == false)
break;
}
}
if (ans == false)
printf("No solution\n");
else
{
int n = 0;
dp[0][0] = 1;
for (int k = 0; k < t; k++)
{
for (int i = 0; i <= n; i++)
{
int j = n-i;
if (dp[i+id[0][k]][j+id[1][k]] == 0 && dp[i][j] == 1)
{
pre[i+id[0][k]][j+id[1][k]].c1 = k*2;
pre[i+id[0][k]][j+id[1][k]].c2= k*2+1;
pre[i+id[0][k]][j+id[1][k]].i = i;
pre[i+id[0][k]][j+id[1][k]].j = j;
dp[i+id[0][k]][j+id[1][k]] = 1;
}
if (dp[i+id[1][k]][j+id[0][k]] == 0 && dp[i][j] == 1)
{
pre[i+id[1][k]][j+id[0][k]].c1 = k*2+1;//记录颜色
pre[i+id[1][k]][j+id[0][k]].c2 = k*2;//记录颜色
pre[i+id[1][k]][j+id[0][k]].i = i;
pre[i+id[1][k]][j+id[0][k]].j = j;
dp[i+id[1][k]][j+id[0][k]] = 1;
}
}
n += id[0][k]+id[1][k];
}
int res = inf;
int a, b;
for (int i = 1; i <= N; i++)
{
int j = N-i;
if (dp[i][j] == 1 && res > abs(i-j))
{
a = i;
b = j;
res = abs(i-j);
}
}
printf("%d", a);
for (int i = a, j = b; !(i == 0 && j == 0);)
{
int c = pre[i][j].c1;
for (int k = 1; k <= N; k++)
{
if (color[k] == c)
printf (" %d", k);
}
int _i = i;
i = pre[i][j].i;
j = pre[_i][j].j;
}
printf("\n");
printf("%d", b);
for (int i = a, j = b; !(i == 0 && j == 0);)
{
int c = pre[i][j].c2;
for (int k = 1; k <= N; k++)
{
if (color[k] == c)
printf (" %d", k);
}
int _i = i;
i = pre[i][j].i;
j = pre[_i][j].j;
}
printf("\n");
}
return 0;
}
#define inf 1000000
using namespace std;
const int MAXN = 101;
int map[MAXN][MAXN];
int id[2][MAXN];
int color[MAXN];
int dp[MAXN][MAXN];
int tmp[MAXN][MAXN];
struct
{
int c1, c2;
int i, j;
}pre[MAXN][MAXN];
int N, t;
bool DFS(int CurV, int c)
{
color[CurV] = c;
id[c%2][t]++;
bool ans = true;
for (int i = 1; i <= N; i++)
{
if (map[CurV][i] == 1)
{
if (color[i] == -1)
{
ans = DFS(i, (c%2==0)?(c+1):(c-1));
if (ans == false)
return false;
}
else if (color[i] == color[CurV])
return false;
}
}
return true;
}
int main()
{
freopen("test.txt", "r", stdin);
scanf("%d", &N);
memset(map, 0, sizeof(map));
memset(id, 0, sizeof(id));
memset(color, 0xff, sizeof(color));
memset(tmp, 0, sizeof(tmp));
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= N; i++)
{
int j;
while (scanf("%d", &j) != EOF && j != 0)
tmp[i][j] = 1;
}
for (int i = 1; i <= N; i++)
{
for (int j = i+1; j <= N; j++)
{
if (!(tmp[i][j] == 1 && tmp[j][i] == 1))
map[i][j] = map[j][i] = 1;
}
}
bool ans;
int c = 0;
t = 0;
for (int i = 1; i <= N; i++)
{
if (color[i] == -1)
{
ans = DFS(i, c);
c += 2;
t++;
if (ans == false)
break;
}
}
if (ans == false)
printf("No solution\n");
else
{
int n = 0;
dp[0][0] = 1;
for (int k = 0; k < t; k++)
{
for (int i = 0; i <= n; i++)
{
int j = n-i;
if (dp[i+id[0][k]][j+id[1][k]] == 0 && dp[i][j] == 1)
{
pre[i+id[0][k]][j+id[1][k]].c1 = k*2;
pre[i+id[0][k]][j+id[1][k]].c2= k*2+1;
pre[i+id[0][k]][j+id[1][k]].i = i;
pre[i+id[0][k]][j+id[1][k]].j = j;
dp[i+id[0][k]][j+id[1][k]] = 1;
}
if (dp[i+id[1][k]][j+id[0][k]] == 0 && dp[i][j] == 1)
{
pre[i+id[1][k]][j+id[0][k]].c1 = k*2+1;//记录颜色
pre[i+id[1][k]][j+id[0][k]].c2 = k*2;//记录颜色
pre[i+id[1][k]][j+id[0][k]].i = i;
pre[i+id[1][k]][j+id[0][k]].j = j;
dp[i+id[1][k]][j+id[0][k]] = 1;
}
}
n += id[0][k]+id[1][k];
}
int res = inf;
int a, b;
for (int i = 1; i <= N; i++)
{
int j = N-i;
if (dp[i][j] == 1 && res > abs(i-j))
{
a = i;
b = j;
res = abs(i-j);
}
}
printf("%d", a);
for (int i = a, j = b; !(i == 0 && j == 0);)
{
int c = pre[i][j].c1;
for (int k = 1; k <= N; k++)
{
if (color[k] == c)
printf (" %d", k);
}
int _i = i;
i = pre[i][j].i;
j = pre[_i][j].j;
}
printf("\n");
printf("%d", b);
for (int i = a, j = b; !(i == 0 && j == 0);)
{
int c = pre[i][j].c2;
for (int k = 1; k <= N; k++)
{
if (color[k] == c)
printf (" %d", k);
}
int _i = i;
i = pre[i][j].i;
j = pre[_i][j].j;
}
printf("\n");
}
return 0;
}