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

2021-08-17 16:10:10 字數 1395 閱讀 5438

題目分析:

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()

#define iis std::ios::sync_with_stdio(false)

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];

int flag,n;

void dfs(int u,int t,int cur)

continue;

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

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...