#include <stdio.h>
#define MAX 110int numOfTasks, numOfPairs;
int numOfProblems;
typedef struct Node{int to;int next;
}Node;
//用邻接链表存储题目
//注意数组别开小了,千万别只是开MAX的大小!!!
Node NodeArray[MAX * 2];
int numOfNodes;
int head[MAX];int problemColor[MAX];typedef struct Set{int stack[MAX];int top;int colorSize[3];
}Set;
Set SetArray[MAX];
int numOfSets;int fail;
int mark[MAX][MAX];void addPair(int from, int to){numOfNodes++;NodeArray[numOfNodes].to = to;NodeArray[numOfNodes].next = head[from];head[from] = numOfNodes;
}void colorPairedProblems(int problem, int SetNum, int color){  problemColor[problem] = color;int top = ++(SetArray[SetNum].top);SetArray[SetNum].stack[top] = problem;SetArray[SetNum].colorSize[color]++;int pairColor = 3 - color;int i, pairedProblem, pairedProblemColor;for (i = head[problem]; i != 0; i = NodeArray[i].next){pairedProblem = NodeArray[i].to;pairedProblemColor = problemColor[pairedProblem];if (pairedProblemColor == color){fail = 1;return;}if (pairedProblemColor == 0)colorPairedProblems(pairedProblem, SetNum, pairColor);if (fail)return;}
}int main(){//freopen("input1.txt", "r", stdin);scanf("%d%d", &numOfTasks, &numOfPairs);numOfProblems = numOfTasks << 1;int i, one, another;for (i = 1; i <= numOfPairs; i++){scanf("%d%d", &one, &another);addPair(one, another);addPair(another, one);}for (i = 1; i <= numOfProblems; i++){if (problemColor[i] == 0){numOfSets++;   colorPairedProblems(i, numOfSets, 1);}if (fail){printf("IMPOSSIBLE\n");return 0;}}mark[0][0] = 1;int set, tasks, tempTasks;for (set = 1; set <= numOfSets; set++)for (tasks = 0; tasks <= numOfTasks; tasks++){if (mark[set - 1][tasks] != 0){tempTasks = tasks + SetArray[set].colorSize[1];if (tempTasks <= numOfTasks && mark[set][tempTasks] == 0)mark[set][tempTasks] = 1;tempTasks = tasks + SetArray[set].colorSize[2];if (tempTasks <= numOfTasks && mark[set][tempTasks] == 0)mark[set][tempTasks] = 2;}}if (mark[numOfSets][numOfTasks] == 0){printf("IMPOSSIBLE\n");return 0;}int numOfTaskLeft = numOfTasks;int top, tempProblem, j;for (set = numOfSets; set > 0; set--){if (mark[set][numOfTaskLeft] == 2){top = SetArray[set].top;//把集合set的所有问题problem的颜色取反for (j = 1; j <= top; j++){tempProblem = SetArray[set].stack[j];problemColor[tempProblem] = 3 - problemColor[tempProblem];}numOfTaskLeft -= SetArray[set].colorSize[2];}elsenumOfTaskLeft -= SetArray[set].colorSize[1];}for (i = 1; i <= numOfProblems; i++)if (problemColor[i] == 1)printf("%d ", i);printf("\n");for (i = 1; i <= numOfProblems; i++)if (problemColor[i] == 2)printf("%d ", i);printf("\n");return 0;
}

URAL 1156 Two Rounds (DFS二分染色 + 分组背包)相关推荐

  1. CF-85E.Guard Towers(二分+染色)

    CF-85E.Guard Towers(二分+染色) 题目链接 题意 nnn个灯塔分成2分,求出最小的曼哈顿距离和其方案树 题意 二分+染色 二分枚举最小值midmidmid,判断能否将nnn个灯塔分 ...

  2. UVA 10004 Bicoloring (二分染色)

    题目链接:https://vjudge.net/problem/UVA-10004 题意:给你一个连通图,问能否将每个节点染成两种颜色之一,使得每条边两边的节点颜色不同. (本质就是二分图的判定,有个 ...

  3. bzoj1728[Usaco2006 Open]Two-Headed Cows 双头牛 二分+染色

    题意挺显然的就不说了. 这题我= =丢脸丢大了.. 一开始我觉得这题双头牛的模型有点像网络流,想了想反手给自己一耳光.. 然后觉得二分可做?但是怎么判断啊? dp不可做啊,这个条件要用上的话时间会炸. ...

  4. P1099 树的直径 DFS + 二分 / 尺取法

    题意 传送门 P1099 树网的核 在任意一条直径上求出的最小偏心距都相等. 树上只有一条直径时显然成立.当树有多条直径,它们必定相交,且中点汇聚于同一处,那么中心附近树的各条直径的重叠部分是相同的, ...

  5. 洛谷P1169 树上分组背包

    题解 第一次写树上分组背包的题目. 什么是分组背包? 分组背包就是将物品进行分组每组内部只能选择一类物品. for(int i = 1;i <= N;++i){for(int j = 0;j & ...

  6. 洛谷 P1757 通天之分组背包

    P1757 通天之分组背包 题目背景 直达通天路·小A历险记第二篇 题目描述 自01背包问世之后,小A对此深感兴趣.一天,小A去远游,却发现他的背包不同于01背包,他的物品大致可分为k组,每组中的物品 ...

  7. hdu 5148 树形dp,分组背包

    题目: 题目分析: 状态方程: dp[当前节点的标号][当前已经选取的城市数] 设已经选取的城市数是K 初始状态: dp[u][0] = dp[u][1] = 0 , 其他的将值设置为无穷大 树形转移 ...

  8. 洛谷:P4516 [JSOI2018] 潜入行动(树形dp、树上分组背包统计方案数)

    潜入行动 题意: 在树上每个点可以放置监控设备,监控该点周围的点(不包括该点),问刚好放置 k 个监控设备监控使得整棵树所有点都被监控的方案数是多少. 思路: 显然是个树形dp,k个监控自然联想分组背 ...

  9. 暑假N天乐 —— 多重+分组背包及变形

    [HDU-1114 Piggy-Bank] 完全背包裸题 http://acm.hdu.edu.cn/showproblem.php?pid=1114 一道迷路的完全背包跑到了这里来...相当于给定背 ...

最新文章

  1. 中国AI又夺一冠!依图刷榜全球声纹识别挑战赛,刷新纪录,大比分夺魁
  2. 整洁代码之道——重构
  3. OpenCv:Mat矩阵的初始化
  4. mysql 按照in id顺序_Mysql查询结果顺序按in()中ID的顺序排列的案例区分
  5. python enumerate用法总结_python enumerate用法总结
  6. 9008刷机怎么刷_OV快捷进入高通进9008或fastboot模式刷机解锁,和MTK关机解锁
  7. DataGridView默认不选中
  8. linux中 」 、」」 的用法
  9. vue el-tree 默认选中_Vue UI:Vue开发者必不可少的工具
  10. 为什么“隐性知识”比“刻意练习”更重要?
  11. 常用的高光谱遥感影像数据集(详细介绍+下载链接)
  12. python开源项目之五子棋
  13. 【python中级】 使用onvif抓图
  14. PM也要学会每天反省
  15. server服务器系统2019安装,windowsserver 2019系统安装教程图文详解
  16. 在微信朋友圈冲浪必备的心灵免疫力
  17. 0 Java语言简介
  18. Python学习笔记(一)压缩与解压缩文件
  19. 物理学的困惑: 个体与交互
  20. linux生成随机数

热门文章

  1. RMAN备份归档日志时的not backed up与catalog数据库结合时的问题
  2. Markdown 里 mermaid 流程图(flowchart)教程
  3. 遇到过什么印象深刻的bug?
  4. PAT 1003 我要通过! python
  5. 无限复活服务器,绝地求生无限复活玩法说明 绝地求生无限复活分数计算规则/吃鸡攻略...
  6. 洛谷-2028 龙兄摘苹果
  7. 怎么压缩gif图大小?试试这个图片压缩攻略
  8. 算法笔记习题 2-9小节
  9. Jackson多克隆抗体丨艾美捷Jackson纳米二级抗体研究
  10. 名人(国家)·经典语录——向 先 辈 低 头, 向 文 明 低 头