当前位置: 首页 > news >正文

HDU 1824 Let#39;s go home (2-SAT判定)

Let's go home

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


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
解题思路:
2-SAT就是两者有冲突就连边。
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <vector>
#include <queue>
#include <algorithm>
#include <stack>
#include <set>
#include <map>
#define LL long long 
using namespace std;
const int MAXN = 20010;
vector<int>G[MAXN];
int pre[MAXN], lowlink[MAXN], sccno[MAXN], dfs_clock, scc_cnt;
stack<int> s;
void dfs(int u)
{
	pre[u] = lowlink[u] = ++dfs_clock;
	s.push(u); int sz = G[u].size();
	for(int i=0;i<sz;i++)
	{
		int v = G[u][i];
		if(!pre[v])
		{
			dfs(v);
			lowlink[u] = min(lowlink[u], lowlink[v]);
		}
		else if(!sccno[v])
		{
			lowlink[u] = min(lowlink[u], pre[v]);
		}
	}
	if(lowlink[u] == pre[u])
	{
		scc_cnt++;
		for(;;)
		{
			int x = s.top(); s.pop();
			sccno[x] = scc_cnt;
			if(x == u) break;
		}
	}
}
void find_scc(int n)
{
	dfs_clock = scc_cnt = 0;
	memset(sccno, 0, sizeof(sccno));
	memset(pre, 0, sizeof(pre));
	for(int i=1;i<=n;i++) if(!pre[i])
		dfs(i);
}
int N, M, T;
int main()
{
	while(scanf("%d%d", &T, &M)!=EOF)
	{
		int x, y, z;
		N = 3 * T;
		for(int i=0;i<=2*N;i++) G[i].clear();
		for(int i=1;i<=T;i++)
		{
			scanf("%d%d%d", &x, &y, &z);
			x++; y++; z++;
			G[x+N].push_back(y);
			G[x+N].push_back(z);
			G[y+N].push_back(x);
			G[z+N].push_back(x);
		}
		for(int i=1;i<=M;i++)
		{
			scanf("%d%d", &x, &y);
			x++; y++;
			G[x].push_back(y + N);
			G[y].push_back(x + N);
		}
		find_scc(2 * N);
		int flag = 1;
		for(int i=1;i<=N;i++)
		{
			if(sccno[i] == sccno[i + N])
			{
				flag = 0;
				break;
			}
		}
		if(flag) puts("yes");
		else puts("no");
	}
	return 0;
}


相关文章:

  • Java Proxy 和 CGLIB 动态代理原理
  • Scrapy
  • python数据分析及展示(二)
  • 千里走单骑:02-北京到上海骑记--Day1.首日征程
  • VS2008设置快捷键Ctrl+W关闭当前打开的文本编辑器窗口
  • 人工智能概念第一股?即将在美国上市的Veritone是怎样一家公司
  • 从setTimeout-setInterval看JS线程
  • 2017 5月22日上午
  • 详解MySQL数据类型
  • JavaScript(二)-精简
  • 以太网交换机市场 华为崛起思科份额减少
  • Linux安全应用之防垃圾邮件server的构建
  • Openstack 干掉 VMWare(1)
  • 如何定制 SSH 来简化远程访问
  • 浪潮发起成立一带一路数字化经济战略联盟
  • #Java异常处理
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 30秒的PHP代码片段(1)数组 - Array
  • Android Volley源码解析
  • HTTP那些事
  • js 实现textarea输入字数提示
  • js中forEach回调同异步问题
  • MySQL-事务管理(基础)
  • React-flux杂记
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 测试开发系类之接口自动化测试
  • 创建一个Struts2项目maven 方式
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 全栈开发——Linux
  • 思否第一天
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 我从编程教室毕业
  • 项目实战-Api的解决方案
  • 一份游戏开发学习路线
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 智能合约Solidity教程-事件和日志(一)
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #微信小程序(布局、渲染层基础知识)
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • .NET Micro Framework 4.2 beta 源码探析
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • /etc/skel 目录作用
  • @Service注解让spring找到你的Service bean
  • [ACM] hdu 1201 18岁生日
  • [BZOJ1877][SDOI2009]晨跑[最大流+费用流]
  • [C# 网络编程系列]专题六:UDP编程
  • [cocos2d-x]关于CC_CALLBACK
  • [halcon案例2] 足球场的提取和射影变换
  • [IOI2018] werewolf 狼人
  • [iOS]Win8下iTunes无法连接iPhone版本的解决方法