我們應該通過思考得到這樣乙個性質:如果乙個點被選了,那麼與它同行同列的點都不能選
然後就是裸的二分圖匹配了……
(我應該能想出這道題來的,可是看了看題覺得沒思路就去看題解了,唉……以後這種水題自己一定要動腦想想!)
**:這種水題應該1a吧
1view codevari,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.
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 顯然目標狀...