HDU 3715 Go Deeper(2-sat)

HDU 3715 Go Deeper(2-sat)

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

HDU 3715 Go Deeper

题目链接

题意:依据题意那个函数,构造x数组。问最大能递归层数

思路:转化为2-sat问题,因为x仅仅能是0。1,c仅仅能是0,1。2那么问题就好办了,对于0, 1, 2相应各自是3种表达式,然后二分深度,搞2-sat就可以

代码:

#include <cstdio>#include <cstring>#include <cstdlib>#include <vector>#include <algorithm>using namespace std;const int MAXNODE = 205;struct TwoSet {	int n;	vector<int> g[MAXNODE * 2];	bool mark[MAXNODE * 2];	int S[MAXNODE * 2], sn;	void init(int tot) {		n = tot * 2;		for (int i = 0; i < n; i += 2) {			g[i].clear();			g[i^1].clear();		}		memset(mark, false, sizeof(mark));	}	void add_Edge(int u, int uval, int v, int vval) {		u = u * 2 + uval;		v = v * 2 + vval;		g[u^1].push_back(v);		g[v^1].push_back(u);	}	void delete_Edge(int u, int uval, int v, int vval) {		u = u * 2 + uval;		v = v * 2 + vval;		g[u^1].pop_back();		g[v^1].pop_back();	}	bool dfs(int u) {		if (mark[u^1]) return false;		if (mark[u]) return true;		mark[u] = true;		S[sn++] = u;		for (int i = 0; i < g[u].size(); i++) {			int v = g[u][i];			if (!dfs(v)) return false;		}		return true;	}	bool solve() {		for (int i = 0; i < n; i += 2) {			if (!mark[i] && !mark[i + 1]) {				sn = 0;				if (!dfs(i)){					for (int j = 0; j < sn; j++)						mark[S[j]] = false;					sn = 0;					if (!dfs(i + 1)) return false;				}			}		}		return true;	}} gao;const int N = 10005;int t, n, m;int a[N], b[N], c[N];bool judge(int dep) {	gao.init(n);	for (int i = 0; i < dep; i++) {		if (c[i] == 0)			gao.add_Edge(a[i], 1, b[i], 1);		else if (c[i] == 1) {			gao.add_Edge(a[i], 0, a[i], 1);			gao.add_Edge(a[i], 0, b[i], 1);			gao.add_Edge(b[i], 0, a[i], 1);			gao.add_Edge(b[i], 0, b[i], 1);		} else			gao.add_Edge(a[i], 0, b[i], 0);	}	return gao.solve();}int main() {	scanf("%d", &t);	while (t--) {		scanf("%d%d", &n, &m);		for (int i = 0; i < m; i++)			scanf("%d%d%d", &a[i], &b[i], &c[i]);		int l = 0, r = m + 1;		while (l < r) {			int mid = (l + r) / 2;			if (judge(mid)) l = mid + 1;			else r = mid;		}		printf("%d\n", l - 1);	}	return 0;}

版权声明:本文博主原创文章,博客,未经同意不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116968.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • CAN2.0和J1939协议的关系

    CAN2.0和J1939协议的关系转发自http://www.cankau.cn/support/help/can-vs-j1939.html很长时间没搞明白j1939与CAN2.0的关系,这篇文章让我明白了。CAN2.0是一种总线规范,是数据链路层的技术。J1939是SAE(美国汽车协会)定义的基于CAN总线的规范,目的是解决不同发动机厂商、不同ECU厂商的兼容性问题。1、J1939和CAN2.0的关系J1939是在CAN2.0…

    2022年5月18日
    47
  • 【搜索】八皇后「建议收藏」

    【搜索】八皇后「建议收藏」这道题应该不陌生吧,这是一道很经典的搜索题。总的意思就是说在一个n*n的棋盘上放n个皇后,要求它们互不攻击,求解有多少种情况,并输出前三种。那么开始分析:这毕竟是一道搜索题,搜索最大的弊端是什么,

    2022年8月4日
    7
  • 初探架构之美_结构优化设计

    初探架构之美_结构优化设计中国科学技术大学软件学院 王松 原创作品版权所有转载请注明出处本科时就听说过《架构之美》这本书,但一直觉得会很深奥而没敢去看。这次课外阅读书籍中再次出现这本书,于是下定决心拜读一下这本著作。敲了几年代码,总觉得代码比较实际,架构比较空洞。“虚幻”的架构往往让人摸不着头脑,因为架构难以落在纸上,人们谈起架构时又总是以一种只可意会不可言传的姿态。美丽的架构无法定义,可它却一定是自然的、

    2025年8月11日
    2
  • ioctl之FIONREAD

    ioctl之FIONREAD在学习ioctl时常常跟read,write混淆。其实ioctl是用来设置硬件控制寄存器,或者读取硬件状态寄存器的数值之类的。而read,write是把数据丢入缓冲区,硬件的驱动从缓冲区读取数据一个个发送或者把接收的数据送入缓冲区。 ioctl(keyFd,FIONREAD,&b)得到缓冲区里有多少字节要被读取,然后将字节数放入b里面。接下来就可以

    2022年7月23日
    18
  • sqljdbc41.jar(Sqljdbc)

    官网下载:windows版本http://go.microsoft.com/fwlink/?LinkId=144633&amp;clcid=0x804UNIX版本http://go.microsoft.com/fwlink/?LinkId=144635&amp;clcid=0x804  推荐几个网站:http://maven.ibiblio.org/maven/http…

    2022年4月12日
    188
  • CSS position属性

    CSS position属性

    2022年1月9日
    45

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号