POJ_1112_Team Them Up!


POJ_1112_Team Them Up!

问题:有N个人,他们两两之间存在认识关系,例如:A,B两个人,存在4种关系,A认识B,B不认识A;B认识A,A不认识B;A不认识B并且B不认识A(互相不认识);A认识B并且B认识A(互相认识);

问题:需要把这N个人分成2组,每组至少1个人,每组中任意2个人都要互相认识,要求2组人员的差值最小;

解决:

1、只有互相认识的人才能放在同一个组,也就是说前面3中情况都不能放在一个组;

2、在满足前面3中情况的两两之间连线,建立无向图G(可能不是连通图,存在连通分支);

3、在G中连线的2个人肯定是不能放在同一个分组里面,于是DFS染色,判断G是否是二分图。如果图G不是二分图,那么肯定无解;

如果G是二分图,计算每个连通分支中分成属于x[i],y[i]2个组的人数(i表示连通分支);

4、对X,Y 2组人员DP(经典的背包问题);可以对2个组之间的差值DP范围是(-100~+100),也可以对2个组的人数DP;我选择的是后一种办法。

dp[i][j](0<=i,j<=100)表示第1组为i个人,第2组为j个人这个状态;dp[i][j]=1表示存在。初始dp[0][0] = 1;然后对每个连通分支DP,转移方程:

if dp[i][j]=1

   dp[i+x[k]][j+y[k]] = 1

   dp[i+y[k]][j+x[k]] = 1

最后取个差值最小的;

 

例如:

5
2 3 5 0
1 4 5 3 0
1 2 5 0
1 2 3 0
4 3 2 1 0

最后建立图
2 - 1
2 - 3
2 - 5

DFS染色求得的分组(顺序不重要):
x y
3 1
1 0

然后DP
对于第1个连通分支:x[0]=3, y[0]=1
dp[0+x[0]][0+y[0]] = dp[0][0] = 1;
dp[0+y[0]][0+x[0]] = dp[0][0] = 1;

即:dp[3][1] = 1, dp[1][3] = 1;

对于第2个连通分支:x[1]=1, y[1]=0;
dp[3+x[1]][1+y[1]] = dp[3][1] = 1;
dp[3+y[1]][1+x[1]] = dp[3][1] = 1;
dp[1+x[1]][3+y[1]] = dp[1][3] = 1;
dp[1+y[1]][3+x[1]] = dp[1][3] = 1;

即:dp[4][1]=1,dp[3][2]=1,dp[1][4]=1,dp[2][3]=1;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值