PAT L3 球隊「食物鏈」 dfs 狀壓 set

2022-02-04 20:10:59 字數 2122 閱讀 5431

題目分析:

1. 一場雙迴圈賽制的籃球賽,注意雙迴圈,雙迴圈!

2. 共有n只球隊,兩兩之間有勝有負有平局;

3. 輸入:

舉例:第一行:w:代表球隊1打贏這只隊伍

l:代表球隊2沒打贏這只隊伍

因為兩隊伍有兩場比賽,所以互相都可能打敗對方;

如果a隊打贏過b隊,就連一條a到b的有向邊;

建邊時注意,如果a隊 "l" b隊,就連一條b->a邊;(忘了這個wa了一發)

(這是坑點1,不是最可怕的)

4. 目的:

找到一條食物鏈:1 3 5 4 2;

代表:1贏過3,3贏過5,5贏過4,4贏過2,並且2贏過1

要迴圈的;

解題思路:

1. 很明顯dfs可以解決;如果a隊打贏過b隊,就連一條a到b的有向邊;

(因為我很傻以為球隊有很多只,怕超時,sb的用set寫,其實這個二維數組建邊就行了,不過兩種寫法差別不大,我就當作 是溫習一下set的知識。結果被set乙個坑點卡了一晚上,賊氣,我在結尾說這個蛋疼的故事)

2. 減枝:狀壓一下吧(應該是叫狀壓吧?唉,我太菜了)

state[cur][i]表示狀態cur的最後一步是i;

如果為1,代表這個不可行,continue掉;

(怎麼弄超連結,我真的不會)

ac**如下:

#include#define test printf("***\n")  

#define ka getchar();getchar()

#define ka1 getchar()

using

namespace

std;

typedef

long

long

ll;

const

int n = 110

; const

int m = 1000005

; const

int inf = 0x3f3f3f3f

; const ll mod = 1000000007

; const

double eps=1e-8

; int

vis[n],ans[n];

int state[1

<<21][n];//

坑點1,狀壓處理

setson[n];

char

ar[n][n];

intflag,n;

void dfs(int u,int t,int

cur)

continue

; }

if(vis[tmp]||state[cur|(1

; vis[tmp]=1

; ans[t]=tmp;

dfs(tmp,t+1,cur|(1

<

if(flag)return

; state[cur|(1

<1

; vis[tmp]=0

; }

} int

main()

for(int i=0;ii)

if(ar[i][j]=='l'

) }

} memset(vis,

0,sizeof

(vis));

vis[

0]=1

; ans[

0]=0

; dfs(

0,1,1

);

if(flag==0

)

for(int i=0;ii)

return

0;

}

view code

(set遍歷元素不是要先:set::iterator 嗎;然後我 set::iterator p,把p作為全域性變數,然後dfs找bug找一晚上,至於為什麼不要設為全域性變數,自己試一下就知道了)

(寫完csdn再寫,真累)

PAT L3 球隊「食物鏈」 dfs 狀壓 set

題目分析 1.一場雙迴圈賽制的籃球賽,注意雙迴圈,雙迴圈!2.共有n只球隊,兩兩之間有勝有負有平局 3.輸入 舉例 第一行 w 代表球隊1打贏過這只隊伍 l 代表球隊2沒打贏過這只隊伍 因為兩隊伍有兩場比賽,所以互相都可能打敗對方 如果a隊打贏過b隊,就連一條a到b的有向邊 建邊時注意,如果a隊 l...

7 15 球隊「食物鏈」 DFS 剪枝)

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

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

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