POJ_1112_Team Them Up!

代码
#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, 
0sizeof(map));
    memset(id, 
0sizeof(id));
    memset(color, 
0xffsizeof(color));
    memset(tmp, 
0sizeof(tmp));
    memset(dp, 
0sizeof(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;
}


posted @ 2010-08-04 22:05  Spirit.Net  阅读(365)  评论(0编辑  收藏  举报