題目分析:
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")view code#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;
}
(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...