题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1824

 

Let's go home

Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2588    Accepted Submission(s): 1125

Problem Description

小时候,乡愁是一枚小小的邮票,我在这头,母亲在那头。
                        —— 余光中

集训是辛苦的,道路是坎坷的,休息还是必须的。经过一段时间的训练,lcy决定让大家回家放松一下,但是训练还是得照常进行,lcy想出了如下回家规定,每一个队(三人一队)或者队长留下或者其余两名队员同时留下;每一对队员,如果队员A留下,则队员B必须回家休息下,或者B留下,A回家。由于今年集训队人数突破往年同期最高记录,管理难度相当大,lcy也不知道自己的决定是否可行,所以这个难题就交给你了,呵呵,好处嘛~,免费**漂流一日。

Input

第一行有两个整数,T和M,1<=T<=1000表示队伍数,1<=M<=5000表示对数。
接下来有T行,每行三个整数,表示一个队的队员编号,第一个队员就是该队队长。
然后有M行,每行两个整数,表示一对队员的编号。
每个队员只属于一个队。队员编号从0开始。

Output

可行输出yes,否则输出no,以EOF为结束。

Sample Input

 

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

Sample Output

 

yes no

Author

威士忌

Source

HDOJ 2007 Summer Exercise(3)- Hold by Wiskey

Recommend

威士忌   |   We have carefully selected several similar problems for you:  1823 1826 1827 1822 1825

Statistic | Submit | Discuss | Note

题意:

集训是辛苦的,道路是坎坷的,休息还是必须的。经过一段时间的训练,lcy决定让大家回家放松一下,但是训练还是得照常进行,lcy想出了如下回家规定,每一个队(三人一队)或者队长留下或者其余两名队员同时留下;每一对队员,如果队员A留下,则队员B必须回家休息下,或者B留下,A回家。由于今年集训队人数突破往年同期最高记录,管理难度相当大,lcy也不知道自己的决定是否可行,所以这个难题就交给你了,呵呵,好处嘛~,免费**漂流一日。

分析:

其实就是简单的2-SAT问题判断,每个人有两种选择:留=0或走=1.

  • 然后该2-SAT要满足两类条件,第一类是 队长留 or 另外两个队员留.

  • 第二类是由M指出的 一对队员a和b的冲突条件.

假设a b c 组成一个队,且a是队长,那么由于队长a与队员(b,c)组合二者只能选其一,

TS.add_and_clause(b,0,c,0);//b留c留
TS.add_and_clause(c,0,b,0);//c留b留TS.add_and_clause(a,1,b,0);//a走b留TS.add_and_clause(a,1,c,0);//a走c留TS.add_and_clause(b,1,a,0);//b走a留TS.add_and_clause(c,1,a,0);//c走a留

对于另外M个条件的a与b来说有:

TS.add_and_clause(a,0,b,1);//a留,导致b走
TS.add_and_clause(b,0,a,1);//b留,导致a走

//注意用的是AND

这样错了好几次

This is the code:

#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<iomanip>
#include<list>
#include<map>
#include<queue>
#include<sstream>
#include<stack>
#include<string>
#include<set>
#include<vector>
using namespace std;
#define PI acos(-1.0)
#define pppp cout<<endl;
#define EPS 1e-8
#define LL long long
#define ULL unsigned long long     //1844674407370955161
#define INT_INF 0x3f3f3f3f      //1061109567
#define LL_INF 0x3f3f3f3f3f3f3f3f //4557430888798830399
// ios::sync_with_stdio(false);
// 那么cin, 就不能跟C的 scanf,sscanf, getchar, fgets之类的一起使用了。
const int dr[]= {0, 0, -1, 1, -1, -1, 1, 1};
const int dc[]= {-1, 1, 0, 0, -1, 1, -1, 1};
int read()//输入外挂
{int ret=0, flag=0;char ch;if((ch=getchar())=='-')flag=1;else if(ch>='0'&&ch<='9')ret = ch - '0';while((ch=getchar())>='0'&&ch<='9')ret=ret*10+(ch-'0');return flag ? -ret : ret;
}const int maxn= 100000+10;
struct TwoSAT
{int n;//原始图的节点数(未翻倍)vector<int> G[maxn*2];//G[i]==j表示如果mark[i]=true,那么mark[j]也要=truebool mark[maxn*2];//标记int S[maxn*2],c;//S和c用来记录一次dfs遍历的所有节点编号void init(int n){this->n=n;for(int i=0; i<2*n; i++)G[i].clear();memset(mark,0,sizeof(mark));}//加入(x,xval)或(y,yval)条件//xval=0表示假,yval=1表示真void add_or_clause(int x,int xval,int y,int yval)//表示或的意思{x=x*2+xval;y=y*2+yval;G[x^1].push_back(y);G[y^1].push_back(x);}//加入(x,xval)且(y,yval)条件//xval=0表示假,yval=1表示真void add_and_clause(int x,int xval,int y,int yval)//表示或的意思{x=x*2+xval;y=y*2+yval;G[x].push_back(y);}//从x执行dfs遍历,途径的所有点都标记//如果不能标记,那么返回falsebool dfs(int x){if(mark[x^1])return false;//这两句的位置不能调换if(mark[x])return true;mark[x]=true;S[c++]=x;for(int i=0; i<G[x].size(); i++)if(!dfs(G[x][i]))return false;return true;}//判断当前2-SAT问题是否有解bool solve(){for(int i=0; i<2*n; i+=2)if(!mark[i] && !mark[i+1]){c=0;if(!dfs(i)){while(c>0)mark[S[--c]]=false;if(!dfs(i+1))return false;}}return true;}
} TS;int main()
{//freopen("D:\\chnegxubianji\\inORout\\in.txt", "r", stdin);//freopen("D:\\chnegxubianji\\inORout\\out.txt", "w", stdout);int n,m;while(~scanf("%d%d",&n,&m)){TS.init(n*3);while(n--){int a,b,c;scanf("%d%d%d",&a,&b,&c);TS.add_and_clause(b,0,c,0);//b留c留TS.add_and_clause(c,0,b,0);//c留b留TS.add_and_clause(a,1,b,0);//a走b留//TS.add_and_clause(b,0,a,1);//b留a走TS.add_and_clause(a,1,c,0);//a走c留//TS.add_and_clause(c,0,a,1);//c留a走TS.add_and_clause(b,1,a,0);//b走a留//TS.add_and_clause(a,0,b,1);//a留b走TS.add_and_clause(c,1,a,0);//c走a留//TS.add_and_clause(a,0,c,1);//a留c走//TS.add_and_clause(b,1,c,1);//b走c走//TS.add_and_clause(c,1,b,1);//c走b走}while(m--){int a,b;scanf("%d%d",&a,&b);TS.add_and_clause(a,0,b,1);//a留,导致b走TS.add_and_clause(b,0,a,1);//b留,导致a走}bool flag=TS.solve();if(flag)puts("yes");elseputs("no");}return 0;
}

hdu 1824-Let's go home 2-SAT (模板)相关推荐

  1. (2 sat) hdu 1824

    Let's go home Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  2. hdu 1824 Let's go home(2-sat 基础题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1824 小时候,乡愁是一枚小小的邮票,我在这头,母亲在那头.                       ...

  3. HDU 1824 Let's go home

    2-SAT,根据题意建好图,求一下强联通分量,判断一下就可以了 #include<cstdio> #include<cstring> #include<cmath> ...

  4. 图论--2-SAT--HDOJ/HDU 1824 Let's go home

    Problem Description 小时候,乡愁是一枚小小的邮票,我在这头,母亲在那头.                         -- 余光中 集训是辛苦的,道路是坎坷的,休息还是必须的. ...

  5. [2-sat专练]poj 3683,hdu 1814,hdu 1824,hdu 3622,hdu 4115,hdu 4421

    文章目录 Priest John's Busiest Day code Peaceful Commission code Let's go home code Bomb Game code Elimi ...

  6. HDU 1824 Let's go home

    B - Let's go home Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:32768KB  ...

  7. HDU - 1824 Let's go home

    Let's go home Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...

  8. HDU 3555 Bomb (数位DP-记忆化搜索模板)

    题意 求区间[1,n]内含有相邻49的数. 思路 比较简单的按位DP思路.这是第一次学习记忆化搜索式的数位DP,确实比递推形式的更好理解呐,而且也更通用~可以一般化: [数位DP模板总结] int d ...

  9. hdu 2255 奔小康赚大钱--KM算法模板

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 题意:有N个人跟N个房子,每个人跟房子都有一定的距离,现在要让这N个人全部回到N个房子里面去,要 ...

  10. hdu 2602 Bone Collector(01背包)模板

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602 Bone Collector Time Limit: 2000/1000 MS (Java/Ot ...

最新文章

  1. DPM2007轻松恢复Exchange邮件,DPM2007系列之三
  2. python 柱形图 负值_Highcharts 使用负值的反向柱形图
  3. (软件工程复习核心重点)第十二章软件项目管理-第二节:进度计划
  4. oracle的in集合,oracle中in与not in集合中有空值问题
  5. 浏览器解析jsx_简单理解JavaScript,TypeScript和JSX
  6. transform:rotate在手机上显示有锯齿的解决方案
  7. [渝粤教育] 西南科技大学 管理会计JG211012 在线考试复习资料2021版
  8. java 事件处理机制
  9. 浏览器Quirksmode(怪异模式)与CSScompat
  10. 将 DataDirect ODBC 驱动程序与 Python 和 pyodbc 一起使用
  11. gg修改器偏移量修改_GG修改器偏移是怎么弄 | 手游网游页游攻略大全
  12. 视觉SLAM和激光SLAM的实现
  13. 移动互联网—电子商务的下一个”战场
  14. jQJQJQJQJQJQ
  15. bat递归查找指定文件_教你在电脑上用批处理脚本全盘查找文件
  16. JavaScript 入门哪本书最好?(问、答) 《转载》
  17. CentOS7.2 Django + uwsgi + Nginx 部(cǎi )署(kēng)指(zhī)南(lǜ)
  18. Your ApplicationContext is unlikely tostart due to a @ComponentScan of the defau
  19. ROS下dobot(magician)机械臂的python demo
  20. PyQt5中的QMessageBox消息弹窗使用示例

热门文章

  1. 前端接收java验证码_在Web项目中手机短信验证码实现的全过程记录
  2. 多元线性回归matlab代码例题_matlab多元线性回归
  3. C++多线程详细讲解
  4. 淘宝开放平台API族
  5. 豆瓣电台WP7客户端 开发记录1
  6. 天龙八部TLBB搭建(一)服务器购买及配置
  7. mybatis-plus QueryWrapper 添加limit
  8. 手机显示系统检测您正在通过代理服务器,当手机无线网出现“检测到您正在使用多个终端共享上网,网络访问被冻结15...
  9. 有几种检测方法可以检测沼气成分?
  10. 联想服务器TS130主板芯片组,【ThinkServer TS130参数】ThinkServer TS130系列服务器参数-ZOL中关村在线...