zoukankan      html  css  js  c++  java
  • L3-015. 球队“食物链”

    L3-015. 球队“食物链”

    时间限制
    1000 ms
    内存限制
    262144 kB
    代码长度限制
    8000 B
    判题程序
    Standard
    作者
    李文新(北京大学)

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

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

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

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

    输入格式:

    输入第一行给出一个整数N(2 <= N <= 20),为参赛球队数。随后N行,每行N个字符,给出了NxN的联赛结果表,其中第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啊。。。dfs题目怎么可能会放在最后一题?... 但是我还是写了一发dfs。。。发现tle了一个测试点。。。这个题目有个特殊的地方,不用dfs n次,

    因为这是一个食物链环,又要求要输出最小字典序,那么肯定是从1开始搜啊。。。

    然后搜了下聚聚们的题解,原来要剪枝一下。。。(原来剪枝的作用这么强大啊)...

    看到还有状态压缩dp...可惜我不会,回头补一下

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int vis[21][21];
     4 char s[23];
     5 int b[21], result[21];
     6 int n, flag=0;
     7 
     8 
     9 bool dfs(int num, int index){
    10     if(flag==1) return true;
    11     result[index]=num;
    12     if(index==n&&vis[num][1]==1) {
    13         flag=1;
    14         return true;
    15     }
    16     else if(index==n&&vis[num][1]!=1) return false;
    17     int cut=0;
    //这里剪枝一下,就是先判断一下当前往下搜有没有能到达1的点,如果没有的话就直接return FALSE 回溯
    18 for(int i=1; i<=n; i++){ 19 if(vis[i][1]==1&&b[i]==0) cut=1; 20 } 21 if(cut==0) return false; 22 for(int i=1; i<=n; i++){ 23 if(vis[num][i]==1&&!b[i]){ 24 b[num]=1; 25 if(dfs(i, index+1)) 26 return true; 27 b[num]=0; 28 } 29 } 30 return false; 31 } 32 33 /* 34 void dfs(int num, int index){ 35 if(flag==1) return; 36 result[index]=num; 37 if(index==n&&vis[num][1]==1){ 38 flag=1; 39 return; 40 } 41 if(index==n) return ; 42 bool cut=0; 43 for(int i=1; i<=n; i++){ 44 if(b[i]==0&&vis[i][1]==1) 45 cut=1; 46 } 47 if(cut==0) return; 48 b[num]=1; 49 for(int i=1; i<=n; i++){ 50 if(b[i]==0&&vis[num][i]==1){ 51 dfs(i, index+1); 52 } 53 } 54 b[num]=0; 55 } 56 */ 57 int main(){ 58 memset(vis, 0, sizeof(vis)); 59 memset(b, 0, sizeof(b)); 60 cin>>n; 61 int f=0; 62 for(int i=1; i<=n; i++){ 63 scanf("%s", s+1); 64 for(int j=1; j<=n; j++){ 65 if(s[j]=='W') vis[i][j]=1; 66 if(s[j]=='L') vis[j][i]=1; 67 } 68 } 69 /* 70 dfs(1, 1); 71 if(flag==1){ 72 int cnt=0; 73 for(int i=1; i<=n; i++){ 74 ++cnt==1?cout<<result[i]:cout<<" "<<result[i]; 75 } 76 cout<<endl; 77 } 78 */ 79 if(dfs(1, 1)){ 80 int cnt=0; 81 for(int i=1; i<=n; i++){ 82 ++cnt==1?cout<<result[i]:cout<<" "<<result[i]; 83 } 84 cout<<endl; 85 } 86 else{ 87 cout<<"No Solution"<<endl; 88 } 89 return 0; 90 }
  • 相关阅读:
    万字长文:大规模 Elasticsearch 高可用集群环境调优实践
    jenkins 配置。
    Xcode的多种Build Configuration
    FZUOJ 2214 Knapsack problem 背包
    Atcoder 070 D Transit Tree Path
    POJ 3903 Stock Exchange LIS
    POJ 2533 Longest Ordered Subsequence 简单DP
    HDU 1260 Tickets 简单DP
    HDU 1114 Piggy-Bank 简单DP
    HDU 1176 免费馅饼 简单DP
  • 原文地址:https://www.cnblogs.com/ledoc/p/6651225.html
Copyright © 2011-2022 走看看