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 }

 

posted @ 2017-03-31 14:28  code_lc  阅读(372)  评论(0编辑  收藏  举报