poj 1112
昨天晚上看的题。
说实话,我一眼就看出了是二分图,再一眼就看出了是二分图+dp(01背包)。但悲剧的是我一眼看出的算法是正确的,但我总以为它是错误的,浪费了很长时间像其他算法(TAT)。
今天终于把代码打了出来,刚开始01背包的优化后来发现是错误的,忘记删了,导致WA一次。吃晚饭时突然发现了,便AC。
2013-6-29
代码:
#include<cstdio>
#include<cstring>
using namespace std;
int n,col[101],w[202],m=0,dp[101][101],pre[101][101];
bool map[101][101]={0},vis[202]={0},f=0;
void dfs(int x,int cur){
vis[x]=1,col[x]=2*m+cur;
w[2*m+cur]++;
for(int i=0;i<n;i++){
if(map[x][i] && vis[i] && col[x]==col[i]){
f=1;
return;
}
if(map[x][i] && !vis[i]){
dfs(i,1^cur);
if(f)return;
}
}
return;
}
int max(int x,int y){
return (x>y)?x:y;
}
int min(int x,int y){
return (x<y)?x:y;
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++){
int x;
while(scanf("%d",&x),x!=0)
map[i][--x]=1;
}
for(int i=0;i<n;i++)
for(int j=0;j<i;j++)
if(map[i][j]*map[j][i]==0 && i!=j)map[i][j]=map[j][i]=1;else map[i][j]=map[j][i]=0;
for(int i=0;i<n;i++)if(!vis[i]){
dfs(i,0);
m++;
}
if(f){
printf("No solution\n");
return 0;
}
m*=2;
memset(dp[0],-1,sizeof(dp[0]));
memset(vis,0,sizeof(vis));
dp[0][0]=0;
for(int i=1;i<=m;i+=2)
for(int j=0;j<=n;j++){ //这里我一开始打成了for(int j=min(w[i-1],w[i]);j<=n;j++)
int a=(i+1)/2;
dp[a][j]=-1;pre[a][j]=-1;
if(j>=w[i-1] && dp[a-1][j-w[i-1]]+w[i-1]>max(dp[a][j],w[i-1]-1))dp[a][j]=max(dp[a][j],dp[a-1][j-w[i-1]]+w[i-1]),pre[a][j]=2;
if(j>=w[i] && dp[a-1][j-w[i]]+w[i]>max(dp[a][j],w[i]-1))dp[a][j]=max(dp[a][j],dp[a-1][j-w[i]]+w[i]),pre[a][j]=1;
}
int j;
for(j=n/2;j>=0 && dp[m/2][j]==-1;j--);
if(j<0){
printf("No solution\n");
return 0;
}
int j1=j;
for(int i=m/2;i>0;i--)
vis[i*2-pre[i][j]]=1,j-=w[i*2-pre[i][j]];
printf("%d",j1);
for(int i=0;i<n;i++)
if(vis[col[i]])printf(" %d",i+1);
printf("\n");
printf("%d",n-j1);
for(int i=0;i<n;i++)
if(!vis[col[i]])printf(" %d",i+1);
printf("\n");
return 0;
}
poj 1112的更多相关文章
- 图论+dp poj 1112 Team Them Up!
题目链接: http://poj.org/problem?id=1112 题目大意: 有编号为1~n的n个人,给出每个人认识的人的编号,注意A认识B,B不一定认识A,让你将所有的人分成两组,要求每组的 ...
- POJ 1112 Team Them Up! 二分图判定+01背包
题目链接: http://poj.org/problem?id=1112 Team Them Up! Time Limit: 1000MSMemory Limit: 10000K 问题描述 Your ...
- 【POJ 1112】Team Them Up!(二分图染色+DP)
Description Your task is to divide a number of persons into two teams, in such a way, that: everyone ...
- 【转载】ACM总结——dp专辑
感谢博主—— http://blog.csdn.net/cc_again?viewmode=list ---------- Accagain 2014年5月15日 动态规划一 ...
- 【DP专辑】ACM动态规划总结
转载请注明出处,谢谢. http://blog.csdn.net/cc_again?viewmode=list ---------- Accagain 2014年5月15日 ...
- dp专题训练
****************************************************************************************** 动态规划 专题训练 ...
- 【DP专辑】ACM动态规划总结(转)
http://blog.csdn.net/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少,多元性强, ...
- dp有哪些种类
dp有哪些种类 一.总结 一句话总结: 二.dp动态规划分类详解 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少,多元性强,主要考察思维能力.建模抽象能力.灵活度. * ...
- (转)dp动态规划分类详解
dp动态规划分类详解 转自:http://blog.csdn.NET/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间 ...
随机推荐
- Spring远程调用技术<3>-Spring的HTTP Invoker
前面提到RMI使用java标准的对象序列化机制,但是很难穿透防火墙. 另一方面,Hessian和Burlap能很好地穿透防火墙,但是使用私有的对象序列化机制. Spring提供的http invke ...
- java线程池(newSingleThreadExecutor())小应用
创建单个线程,用来操作一个无界的队列任务,不会使用额外的线程.如果线程崩溃会重新创建一个,直到任务完成. 代码: import java.util.concurrent.ExecutorService ...
- mongodb基本操作的学习
1.基本操作: 如何安装?创建存放数据的文件夹 robomongo: 图形化管理工具 create -->save -->connect 创建数据库:use Database_name 检 ...
- 4.bootstrap练习笔记-内容区块
bootstrap练习笔记-内容区块 1.bootstrap中,采用的全部是div布局,把你的内容首先要包含在一个大的DIV区块当中 2.然后再写一个div.container,这个div里面存放真正 ...
- jdbc java数据库连接 6)类路径读取——JdbcUtil的配置文件
之前的代码中,以下代码很多时候并不是固定的: private static String url = "jdbc:mysql://localhost:3306/day1029?useUnic ...
- HTML 学习笔记 JavaScript (prototype)
原博地址:http://www.cnblogs.com/dolphinX/p/3286177.html 原博客的作者是一个非常牛逼的前端大神,我作为一个初学者,在此借助大神的博客进行自己的学习.在这里 ...
- SQLMAP大全
转自:http://blog.csdn.net/zsf1235/article/details/50974194 本人小白,初次认识sqlmap,很多都是转载资料,只是学习研究一下! 练习的网站可以用 ...
- .jshintrc配置
在root目录创建一个.jshintrc文件插入下面的代码即可.也可以自行配置. { // // 强制选项 // // When set to true, these options will mak ...
- Linux 进程间通讯详解三
msgctl()函数 int msgctl(int msqid, int cmd, struct msqid_ds *buf); --参数 msqid:有msgget函数返回的消息队列标识码 cmd: ...
- 82 fsck-检查与修复 Linux 档案系统
Linux fsck命令用于 检查与修复 Linux 档案系统,可以同时检查一个或多个 Linux 档案系统. 语法 fsck [-sACVRP] [-t fstype] [--] [fsck-opt ...