POJ 1636

题意:

两个人数一样的监狱,有一些囚犯不能在一起,两个监狱要等数量(<m/2)交换一些囚犯,问最多可以交换多少个囚犯;

根据条件可以画出一个二分图,接着可以由二分图得到的若干个连通分量。而当你选中一个囚犯的时候,因为约束条件,整个的连通分量都会受到牵连,

即这个囚犯所在的连通分量的所有囚犯都要交换。设p[i],q[i]分别为这次选取的a,b监狱中所取囚犯个数;

就可转化为背包问题;

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <string.h>
 4 using namespace std;
 5 const int M=202;
 6 bool rel[M][M],a[M],b[M],dp[M][M];
 7 int p[M],q[M];
 8 int n,m,r,aa,bb;
 9 void dfs(int i,int k){
10     if(k){
11         a[i]=1;
12         aa++;
13         for(int j=1;j<=m;j++){
14             if(rel[i][j]&&!b[j]){
15                 dfs(j,0);
16             }
17         }
18     }
19     else {
20         b[i]=1;
21         bb++;
22         for(int j=1;j<=m;j++){
23             if(rel[j][i]&&!a[j]){
24                 dfs(j,1);
25             }
26         }
27     }
28 }
29 int main(){
30     int x,y;
31     scanf("%d",&n);
32     while(n--){
33         int i;
34         memset(rel,0,sizeof(rel));
35         memset(dp,0,sizeof(dp));
36         memset(a,0,sizeof(a));
37         memset(b,0,sizeof(b));
38         scanf("%d%d",&m,&r);
39         for(i=0;i<r;i++){
40             scanf("%d%d",&x,&y);
41             rel[x][y]=1;
42         }
43         int t=0;
44         for(i=1;i<=m;++i){
45             if(!a[i]){
46                 aa=bb=0;
47                 dfs(i,1);
48                 p[t]=aa;
49                 q[t++]=bb;
50             }
51         }
52         for(i=1;i<=m;++i){
53             if(!b[i]){
54                 aa=bb=0;
55                 dfs(i,0);
56                 p[t]=aa;
57                 q[t++]=bb;
58             }
59         }
60         dp[0][0]=1;
61         for(i=0;i<t;++i){
62             for(int j=m/2;j>=p[i];--j){
63                 for(int k=m/2;k>=q[i];--k){
64                     if(dp[j-p[i]][k-q[i]]){dp[j][k]=1;}
65                 }
66             }
67         }
68         for(i=m/2;i>=0;--i)if(dp[i][i]){break;}
69         printf("%d\n",i);
70     }
71     return 0;
72 }
时间: 2024-11-25 15:45:57

POJ 1636的相关文章

POJ 1636 Prison rearrangement DFS+0/1背包

题目链接: POJ 1636 Prison rearrangement Prison rearrangement Time Limit: 3000MS   Memory Limit: 10000K Total Submissions: 2194   Accepted: 984 Description In order to lower the risk of riots and escape attempts, the boards of two nearby prisons of equal

noip Dynamic Programming

noip Dynamic Programming A - Jury Compromise POJ 1015 题意: 有n(<=200)个人作为陪审团的被选举成员,分别有正方和反方给予的评价,要求在这n个人中选出m(<=20)个人,在保证正方评价之和与反方评价之和差最小的情况下,使得评价分数总和最高. 题解: 0.定义状态fi][k]当前已经选取了i个人并且这i个人的差值为k时的评分总和的最大值,p[i][k]当前已经选取了i个人并且这i个人的差值为k时第i个人的编号. 1.如果令c[i]表示第

POJ 2728 JZYZOJ 1636 分数规划 最小生成树 二分 prim

http://172.20.6.3/Problem_Show.asp?id=1636 复习了prim,分数规划大概就是把一个求最小值或最大值的分式移项变成一个可二分求解的式子. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 #include<cstdlib> 7 using na

ACM训练方案-POJ题目分类

ACM训练方案-POJ题目分类 博客分类: 算法 ACM online Judge 中国: 浙江大学(ZJU):http://acm.zju.edu.cn/ 北京大学(PKU):http://acm.pku.edu.cn/JudgeOnline/ 杭州电子科技大学(HDU):http://acm.hdu.edu.cn/ 中国科技大学(USTC):http://acm.ustc.edu.cn/ 北京航天航空大学(BUAA)http://acm.buaa.edu.cn/oj/index.php 南京

转载:poj题目分类(侵删)

转载:from: POJ:http://blog.csdn.net/qq_28236309/article/details/47818407 按照ac的代码长度分类(主要参考最短代码和自己写的代码) 短代码:0.01K–0.50K:中短代码:0.51K–1.00K:中等代码量:1.01K–2.00K:长代码:2.01K以上. 短:1147.1163.1922.2211.2215.2229.2232.2234.2242.2245.2262.2301.2309.2313.2334.2346.2348

poj 动态规划题目列表及总结

此文转载别人,希望自己能够做完这些题目! 1.POJ动态规划题目列表 容易:1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1208, 1276,1322, 1414, 1456, 1458, 1609, 1644, 1664, 1690, 1699, 1740(博弈),1742, 1887, 1926(马尔科夫矩阵,求平衡), 1936, 1952, 1953, 1958, 1959, 1962, 1975,

动态规划POJ专题

声明:本文属博主原创文章,未经允许请勿转载. 经典题目题号(此处为转载):容易: 1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1191,1208, 1276, 1322, 1414, 1456, 1458, 1609, 1644, 1664, 1690, 1699, 1740, 1742, 1887, 1926, 1936, 1952, 1953, 1958, 1959, 1962, 1975, 1989, 

POJ - 3186 Treats for the Cows (区间DP)

题目链接:http://poj.org/problem?id=3186 题意:给定一组序列,取n次,每次可以取序列最前面的数或最后面的数,第n次出来就乘n,然后求和的最大值. 题解:用dp[i][j]表示i~j区间和的最大值,然后根据这个状态可以从删前和删后转移过来,推出状态转移方程: dp[i][j]=max(dp[i+1][j]+value[i]*k,dp[i][j-1]+value[j]*k) 1 #include <iostream> 2 #include <algorithm&

POJ 2533 - Longest Ordered Subsequence(最长上升子序列) 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:http://poj.org/problem?id=2533 Description A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequence of the given numeric sequence (a1, a2, ..., aN) be any sequence (ai1, ai2, ..., aiK)