ZJOI2007矩陣遊戲

2022-05-12 13:23:57 字數 1526 閱讀 2754

我們應該通過思考得到這樣乙個性質:如果乙個點被選了,那麼與它同行同列的點都不能選

然後就是裸的二分圖匹配了……

(我應該能想出這道題來的,可是看了看題覺得沒思路就去看題解了,唉……以後這種水題自己一定要動腦想想!)

**:這種水題應該1a吧

1

vari,j,n,t:longint;

2flag:boolean;

3 p:array[0..250] of

longint;

4 v:array[0..250] of

boolean;

5 a:array[0..250,0..250] of

longint;

6function

find(x:longint):boolean;

7var

i:longint;

8begin

9for i:=1

to n do

10if (not(v[i])) and (a[x,i]=1) then

11begin

12 v[i]:=true;

13if (p[i]=0) or (find(p[i])) then

14begin

15 p[i]:=x;

16exit(true);

17end;18

end;

19exit(false);

20end;21

procedure

init;

22begin

23readln(n);

24 fillchar(p,sizeof(p),0

);25

for i:=1

to n do

26begin

27for j:=1

to n do

read(a[i,j]);

28readln;

29end;30

end;

31procedure

main;

32begin

33 flag:=true;

34for i:=1

to n do

35begin

36fillchar(v,sizeof(v),false);

37if

not(find(i)) then

begin flag:=false;break;end;38

end;

39if flag then writeln('

yes') else writeln('no'

);40

end;

4142

begin

43readln(t);

44while t>0

do45

begin

46dec(t);

47init;

48main;

49end;50

end.

view code

ZJOI2007 矩陣遊戲

霧。既然我們要求每行每列都要有乙個 1 那麼我們就可以這樣進行建立了這個二分圖。左邊有 n 個點,代表行,右邊有 n 個點,代表列。做這題的主要目的是打板子 二分圖匹配用的dinic bzoj 1059 這裡寫鏈結內容 include include include include include ...

ZJOI2007 矩陣遊戲

我們發現同行同列的點無論經過多少次變換仍然同行或同列,所以題目可轉換為能不能找到n個互相不同行或同列的點。那麼我們用二分圖求一下最大匹配即可。include using namespace std const int n 205 int t,n,x,ans int match n 1 bool vi...

ZJOI2007 矩陣遊戲

這道題是乙個不錯的題,難點就在於建模。交換操作過程中,同一行的黑塊是不會被拆開,同理縱塊也是。接著目標狀態就是一條對角線上全都是黑塊。我們倒過來想,看看能否從目標狀態變成初始狀態。對於所有的黑塊 x,y 左邊行右邊列,點分行列 我們連條邊 x leftarrow rightarrow y 顯然目標狀...