代码
#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 ;
}