美文网首页PAT
GPLT L3-015. 球队“食物链” dfs回溯+小剪枝

GPLT L3-015. 球队“食物链” dfs回溯+小剪枝

作者: 无令便逐风 | 来源:发表于2018-03-26 12:04 被阅读1次

题目链接戳这里

题目大意:许多球队之间有输赢关系,求一条用字典序最小来表示的链环, a->b..->z 使得前一个队伍赢过后一个队伍,既然是环,那么z->a也要成立.

注意点:

  • 单向边建立的依据是"赢过",对于a队而言,a赢b和b输a,都要有一条a->b.
  • 如果能成环,始终可以把1号队伍转到第一个位置,所以直接从第一个队伍开始dfs(所以一开始要在最外层vis[0]=1),第一个解即是字典序最小的答案.
  • 再而要减枝才能过第四个数据点,方法是判断后续所有队伍是否有队伍赢过第一个队伍,若根本就没有,也就无从构成环,直接return.
#include <iostream>
#include <bits/stdc++.h>
using namespace std;

#define mst(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(int i=(a);i<(b);++i)
const int inf = 0x3f3f3f3f, maxN = 25;
int N, M;
char CG[maxN][maxN];
int G[maxN][maxN], vis[maxN], way[maxN];

bool dfs(int s, int cnt) {
    way[cnt] = s + 1;
    if (cnt == N - 1) {
        if (!G[s][0])
            return 0;
        return 1;
    }

    int idx = 0;
    for (idx = 0; idx < N; ++idx)
        if (!vis[idx] && G[idx][0])
            break;
    if (idx == N)
        return 0;

    rep(i, 0, N) {
        if (!vis[i] && G[s][i]) {
            vis[i] = 1;
            if (dfs(i, cnt + 1))
                return 1;
            vis[i] = 0;
        }
    }
    return 0;
}

int main() {
    // freopen("data.in", "r", stdin);
    scanf("%d", &N);
    rep(i, 0, N) {
        scanf("%s", CG[i]);
        rep(j, 0, N) {
            if (CG[i][j] == 'W')
                G[i][j] = 1;
            else if (CG[i][j] == 'L')
                G[j][i] = 1;
        }
    }
    vis[0] = 1;
    if (dfs(0, 0)) {
        rep(i, 0, N) {
            if (i) printf(" ");
            printf("%d", way[i]);
        }
    } else {
        puts("No Solution");
    }
    return 0;
}

相关文章

  • GPLT L3-015. 球队“食物链” dfs回溯+小剪枝

    题目链接戳这里 题目大意:许多球队之间有输赢关系,求一条用字典序最小来表示的链环, a->b..->z 使得前一个...

  • DFS+记忆化搜索

    dfs 和 bsf 和 回溯回溯是有剪枝的dfshttp://blog.csdn.net/fightforyour...

  • 暴力搜索 | DFS 回溯剪枝

    「算法笔记」「上机指南」买来一个多月了。还是在自己胡乱coding,今天本打算看一下我并不熟的最小堆emmmmmm...

  • 深搜 排列组合

    1.DFS 2.回溯 回溯法是剪枝的暴力法。 剪枝函数包括两类:1.使用约束函数,剪去不满足约束条件的路径;2.使...

  • 回溯法

    概述 Backtracking 回溯法实现 => DFS + 剪枝(跳过对某些一定不是解的子树) 可以把问题所有的...

  • 算法

    算法应用BFS广度优先搜索DFS深度优先搜索回溯法(DFS+剪枝)部分和问题分治法快速排序、归并排序动态规划背包问...

  • 回溯

    回溯:递归的一种,或者说是通过递归这种代码结构来实现回溯这个目的。回溯法可以被认为是一个有过剪枝的DFS过程。把问...

  • LeetCode 组合问题刷题小结

    本节,我们将总结LeetCode组合相关的题。 这些题有很多相似的地方,回溯,剪枝,dfs等等,题目如下: 77....

  • 回溯算法

    回溯算法的原理是深度优先搜索(dfs),然后分析题目寻找剪枝的方法以此来优化算法,降低时间复杂度。 回溯算法有一个...

  • 1190 生日蛋糕 NI

    dfs+剪枝

网友评论

    本文标题:GPLT L3-015. 球队“食物链” dfs回溯+小剪枝

    本文链接:https://www.haomeiwen.com/subject/uctrcftx.html