題目分析:
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...