zoukankan      html  css  js  c++  java
  • L3-015 球队“食物链” (30 分)

    L3-015 球队“食物链” (30 分)
     

    某国的足球联赛中有N支参赛球队,编号从1至N。联赛采用主客场双循环赛制,参赛球队两两之间在双方主场各赛一场。

    联赛战罢,结果已经尘埃落定。此时,联赛主席突发奇想,希望从中找出一条包含所有球队的“食物链”,来说明联赛的精彩程度。“食物链”为一个1至N的排列{ T1​​ T2​​ ⋯ TN​​ },满足:球队T1​​战胜过球队T2​​,球队T2​​战胜过球队T3​​,⋯,球队T(N1)​​战胜过球队TN​​,球队TN​​战胜过球队T1​​。

    现在主席请你从联赛结果中找出“食物链”。若存在多条“食物链”,请找出字典序最小的。

    注:排列{ a1​​ a2​​ ⋯ aN​​}在字典序上小于排列{ b1​​ b2​​ ⋯ bN​​ },当且仅当存在整数K(1),满足:aK​​<bK​​且对于任意小于K的正整数i,ai​​=bi​​。

    输入格式:

    输入第一行给出一个整数N(2),为参赛球队数。随后N行,每行N个字符,给出了N×N的联赛结果表,其中第i行第j列的字符为球队i在主场对阵球队j的比赛结果:W表示球队i战胜球队j,L表示球队i负于球队j,D表示两队打平,-表示无效(当i=j时)。输入中无多余空格。

    输出格式:

    按题目要求找到“食物链”T1​​ T2​​ ⋯ TN​​,将这N个数依次输出在一行上,数字间以1个空格分隔,行的首尾不得有多余空格。若不存在“食物链”,输出“No Solution”。

    输入样例1:

    5
    -LWDW
    W-LDW
    WW-LW
    DWW-W
    DDLW-
    

    输出样例1:

    1 3 5 4 2
    

    输入样例2:

    5
    -WDDW
    D-DWL
    DD-DW
    DDW-D
    DDDD-
    

    输出样例2:

    No Solution

    经典题 值得一做

    DFS剪枝 两点要注意的 一是vector要是写在我注释的地方 会有重边导致WA

    二是 地图中的L要反向建图

    另一个是 要剪枝

    还有一个是 推荐写成 

    if (layer == N - 1) 判断退出

    如果写成 if(layer == N) 判断退出
    在这一步
    if (!vis[i] && mp[i][0])
    倒数第一个点到第一个点 vis倒数第一个点是遍历过的 所以这个时候cnt会等于0 导致总是no solution
    using namespace std;
    #include <stdio.h>
    #include <iostream>
    #include <cstring>
    #include <vector>
    #include <sstream>
    #include <algorithm>
    int N, M, K;
    const int si = 30;
    vector<int> G[si];
    int mp[si][si];
    bool fl = 0;
    bool vis[si];
    int road[si];
    
    void dfs(int x, int layer) {//现在在x y的位置
        if (fl) return;
        road[layer] = x;
        if (layer == N - 1) {
            if ( mp[x][0]) fl = 1;
            return;
        }
        int cnt = 0;
        for (int i = 0; i < N; i++) {
            if (!vis[i] && mp[i][0]) {
                cnt++; break;
            }
        }
        if (!cnt) return;
        for (int i = 0; i < G[x].size(); i++) {
            int to = G[x][i];
            if (vis[to]) continue;
            vis[to] = 1;
            dfs(to, layer + 1);
            vis[to] = 0;
        }
    }
    int main() {
        cin >> N;
        char s[si];
        for (int i = 0; i < N; i++) {
            scanf("%s", s);
            for (int j = 0; j < N; j++) {
                if (s[j] == 'W') {
                    //G[i].push_back(j);
                    mp[i][j] = 1;
                }
                if (s[j] == 'L') {
                    mp[j][i] = 1;
                //    G[j].push_back(i);
                }
            }
        }
        for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
        if (mp[i][j])
        G[i].push_back(j);
    
        vis[0] = 1;
        dfs(0, 0);
        if (fl) {
            for (int i = 0; i < N ; i++) {
                printf("%d%c", road[i] + 1, i == N - 1? '
    ' : ' ');
            }
        }
        else {
            printf("No Solution
    ");
        }
        return 0;
    }
  • 相关阅读:
    【做题记录】区间排序—线段树
    【做题记录】CF1428E Carrots for Rabbits—堆的妙用
    线段树合并、分裂
    一、drf入门规范
    七、Django实战--图书管理系统搭建
    六、ORM模型层补充
    五、Django之模型层
    四、Django之模板层
    三、Django之视图层
    二、Django之路由层
  • 原文地址:https://www.cnblogs.com/smatrchen/p/10623829.html
Copyright © 2011-2022 走看看