首页 > 其他分享 >HDU - 3715 Go Deeper (二分 + 2-SAT)

HDU - 3715 Go Deeper (二分 + 2-SAT)

时间:2023-04-07 11:03:02浏览次数:41  
标签:3715 连边 HDU Deeper 递归函数 int 给出 include define


题目大意:给出一个递归函数,问这个递归函数最多能递归几层

解题思路:二分枚举递归层数,然后依此建边

如果给出的c[i]为0时,那么x[a[i]]和x[b[i]]中的其中一个要为真,连边即为 !a[i]->b[i], !b[i] -> a[i]

如果给出的c[i]为1时,那么x[a[i]]和x[b[i]]两个要么都为真,要么都为假,连边即为a[i]->b[i], b[i]->a[i], !a[i]->!b[i], !b[i]->!a[i]

如果给出的c[i]为2时,那么x[a[i]]和x[b[i]]两个中的一个要为假
,连边即为a[i]->!b[i], b[i]->!a[i]

#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;

#define N 10010
#define M 410

struct Node {
    int a, b, c;
}node[N];

vector<int> G[M];
bool mark[M];
int S[M];
int n, m, top;

void init() {
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= m; i++) {
        scanf("%d%d%d", &node[i].a, &node[i].b, &node[i].c);
    }
}

bool dfs(int u) {
    if (mark[u ^ 1])
        return false;
    if (mark[u])
        return true;
    mark[u] = true;
    S[++top] = u;
    for (int i = 0; i < G[u].size(); i++)
        if (!dfs(G[u][i]))
            return false;
    return true;
}

void AddEdge(int x, int valx, int y, int valy) {
    G[2 * x + valx].push_back(y * 2 + valy);
}

bool judge(int mid) {
    for (int i = 0; i < 2 * n; i++)
        G[i].clear();

    for (int i = 1; i <= mid; i++) {
        if (node[i].c == 0) {
            AddEdge(node[i].a, 0, node[i].b, 1);
            AddEdge(node[i].b, 0, node[i].a, 1);
        }
        else if (node[i].c == 1) {
            AddEdge(node[i].a, 0, node[i].b, 0);
            AddEdge(node[i].b, 0, node[i].a, 0);
            AddEdge(node[i].a, 1, node[i].b, 1);
            AddEdge(node[i].b, 1, node[i].a, 1);
        }
        else if (node[i].c == 2) {
            AddEdge(node[i].a, 1, node[i].b, 0);
            AddEdge(node[i].b, 1, node[i].a, 0);
        }
    }

    memset(mark, 0, sizeof(mark));
    for (int i = 0; i < 2 * n; i += 2) {
        if (!mark[i] && !mark[i ^ 1]) {
            top = 0;
            if (!dfs(i)) {
                while (top) mark[S[top--]] = false;
                if (!dfs(i ^ 1))
                    return false;
            }
        }
    }
    return true;
}

void solve() {
    int l = 1, r = m, mid;
    while (l <= r) {
        mid = (l + r) / 2;
        if (judge(mid))
            l = mid + 1;
        else
            r = mid - 1;
    }
    printf("%d\n", l - 1);
}

int main() {
    int test;
    scanf("%d", &test);
    while (test--) {
        init();
        solve();
    }
    return 0;
}


标签:3715,连边,HDU,Deeper,递归函数,int,给出,include,define
From: https://blog.51cto.com/u_10970600/6175576

相关文章

  • HDU - 1317 XYZZY (floyd + 最长路)
    题目大意:有一种游戏,游戏里面有N个房间,每个房间有相应的能量值,走入该房间就可以得到相应的能量值现在你要从房间1出发,走到房间N,如果中途能量耗尽了,就表示输了,反之,则为赢解题思路:首先得判断一下能不能到达N,这可以用Floyd去判断如果能直接走到N的话,就算赢,否则判断一下,看是否有正环......
  • HDU 5479 Scaena Felix(DP)
    题目大意:给出一系列的由’(‘和’)’组成的字符串,现有一种操作,可以将括号的方向变反,但需要花费1现在问,需要花费多少的代价才能使该字符串的任意一个连续子串都不存在”()”的配对解题思路:用dp[i][0]表示第i个位置变成’(‘的代价,dp[i][1]表示第i个位置变成’)’的代价如果当前......
  • hdu-5306(区间最值+线段树)
    hduGorgeousSequenceHDU-5306题意:给定一个长度为n的区间,做m次操作,三种操作对于序列[L,R]区间中的每个ai,用min(ai,x)替换。打印序列[L,R]区间的最大值打印序列[L,R]区间和因为区间和与区间最值无关,所以无法直接用简单的标记处理。区间最值与区间和如何扯上关系呢?我......
  • HDU 2196 Computer(树形DP) 入门模板
    ComputerTimeLimit:1000/1000MS(Java/Others)    MemoryLimit:32768/32768K(Java/Others)TotalSubmission(s):34313    AcceptedSubmission(s):5345 ProblemDescriptionAschoolboughtthefirstcomputersometimeago(sothiscomputer'sidis1).D......
  • HDU动态规划题解目录
    ProblemA:MaxSum(HDU1003)   点击这里ProblemB:CommonSubsequence(HDU1159)    点击这里ProblemC:SuperJumping!Jumping!Jumping!(HDU1087)    点击这里ProblemD:HumbleNumbers(HDU1058)   点击这里ProblemE:MonkeyandBanana(HDU1069)    点击这里ProblemF:......
  • hdu - 4578(线段树)
    题目:Yuanfangispuzzledwiththequestionbelow:Therearenintegers,a1,a2,…,an.Theinitialvaluesofthemare0.Therearefourkindsofoperations.Operation1:Addctoeachnumberbetweenaxandayinclusive.Inotherwords,dotransformationak&......
  • HDU 3328 Flipper 栈的应用
    FlipperTimeLimit:2000/1000MS(Java/Others)    MemoryLimit:32768/32768K(Java/Others)TotalSubmission(s):521    AcceptedSubmission(s):334ProblemDescriptionLittleBobbyRoberts(sonofBigBob,ofProblemG)playsthissolitairememory......
  • hdu3595 GG and MM Every SG博弈
    这是一道很神奇的题,神奇的地方在于全网这个模型只有这题什么是EverySG?不同于普通的ICG,它由多个游戏同时进行,且必须同时进行比如这道题,要求先手一次对所有石头堆都要操作显然对于单独的每种情况,我们都可以求出这是必败态还是必胜态现在摆在我们眼前的就有一堆游戏,对于每个游......
  • hdu3980 Paint Chain SG函数+SG定理+记忆化搜索
    liyishui今天学习博弈,因为liyishui今天写树链剖分写得有点理智--题意:有一个圆,上面有n个豆子,每次要挑出连续m个没染色的豆子进行染色,不能移动时输掉游戏问先手必胜还是后手必胜,其中n、m<=1000题解:会很朴素地想到如果第一个人拿走了m个,那么剩下的就是一条链的问题。所以可以先......
  • 确定比赛名次 HDU - 1285 (拓扑排序)
    题意:有N个比赛队(1≤N≤500),编号依次为1,2,3,...,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比......