L3 015 球隊「食物鏈」 dfs 剪枝

2021-09-13 14:02:51 字數 1650 閱讀 1773

l3-015 球隊「食物鏈」 (30 分)

某國的足球聯賽中有n支參賽球隊,編號從1至n。聯賽採用主客場雙迴圈賽制,參賽球隊兩兩之間在雙方主場各賽一場。

聯賽戰罷,結果已經塵埃落定。此時,聯賽主席突發奇想,希望從中找出一條包含所有球隊的「食物鏈」,來說明聯賽的精彩程度。「食物鏈」為乙個1至n的排列,滿足:球隊t​1​​戰勝過球隊t​2​​,球隊t​2​​戰勝過球隊t​3​​,⋯,球隊t​(n−1)​​戰勝過球隊t​n​​,球隊t​n​​戰勝過球隊t​1​​。

現在主席請你從聯賽結果中找出「食物鏈」。若存在多條「食物鏈」,請找出字典序最小的。

注:排列在字典序上小於排列,當且僅當存在整數k(1≤k≤n),滿足:a​k​​輸入第一行給出乙個整數n(2≤n≤20),為參賽球隊數。隨後n行,每行n個字元,給出了n×n的聯賽結果表,其中第i行第j列的字元為球隊i在主場對陣球隊j的比賽結果:w表示球隊i戰勝球隊j,l表示球隊i負於球隊j,d表示兩隊打平,-表示無效(當i=j時)。輸入中無多餘空格。

按題目要求找到「食物鏈」t​1​​ t​2​​ ⋯ t​n​​,將這n個數依次輸出在一行上,數字間以1個空格分隔,行的首尾不得有多餘空格。若不存在「食物鏈」,輸出「no solution」。

5

-lwdw

w-ldw

ww-lw

dww-w

ddlw-

1 3 5 4 2
5

-wddw

d-dwl

dd-dw

ddw-d

dddd-

no solution
思路:

qwq這題居然會卡時間,需要dfs的時候剪枝!!!

具體方法是:

到每個點的時候,判斷剩下沒訪問過的點裡,有沒有能到1的點,沒有就可以剪掉了(一次迴圈,也就o(n),n<=20)

(因為是1個環,所以肯定是從1開始的)

**如下:

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define ll long long

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

typedef pairp;

const int inf=4e8;

const int n=25,mod=32767;

vectorg[n];

int vis[n],n,flag=0;

int ans[n],dui[n][n];

void dfs(int now,int dep)

return ;

}else if(dep>=n)return ;

int q=0;

for(int i=2;i<=n;i++)

if(q==0)return ;

for(int i=0;i積累剪枝的方法啊,為啥我每次都不會剪呢qwq

L3 015 球隊「食物鏈」 DFS 剪枝

時間限制 1000 ms 記憶體限制 262144 kb 長度限制 8000 b 判題程式 standard 作者李文新 北京大學 某國的足球聯賽中有n支參賽球隊,編號從1至n。聯賽採用主客場雙迴圈賽制,參賽球隊兩兩之間在雙方主場各賽一場。聯賽戰罷,結果已經塵埃落定。此時,聯賽主席突發奇想,希望從中...

L3 015 球隊「食物鏈」

時間限制 1000 ms 記憶體限制 262144 kb 長度限制 8000 b 判題程式 standard 作者 李文新 北京大學 某國的足球聯賽中有n支參賽球隊,編號從1至n。聯賽採用主客場雙迴圈賽制,參賽球隊兩兩之間在雙方主場各賽一場。聯賽戰罷,結果已經塵埃落定。此時,聯賽主席突發奇想,希望從...

L3 015 球隊「食物鏈」 30分

某國的足球聯賽中有n支參賽球隊,編號從1至n。聯賽採用主客場雙迴圈賽制,參賽球隊兩兩之間在雙方主場各賽一場。聯賽戰罷,結果已經塵埃落定。此時,聯賽主席突發奇想,希望從中找出一條包含所有球隊的 食物鏈 來說明聯賽的精彩程度。食物鏈 為乙個1至n的排列,滿足 球隊t 1 戰勝過球隊t 2,球隊t 2戰勝...