ZJOI2007 矩陣遊戲

2022-05-08 01:15:08 字數 880 閱讀 5326

很容易想到去吧棋盤模型轉為二分圖。

發現是乙個類似行列匹配的問題。

進一步,如果每乙個行都可以找到乙個列與之配對的話,一定可以通過交換滿足要求。

直接dinic求二分圖最大匹配即可。

#include#include#include#include#include#include#include#include#include#define n 110000

#define eps 1e-7

#define inf 1e9+7

#define ll long long

using namespace std;

inline int read()

while(isdigit(ch))

return x*flag;

}struct edge

e[n*2];

int num,head[n];

inline void add(int x,int y,int z)

;head[x]=num;

e[++num]=(edge);head[y]=num;

}queueq;

int n,m,s,t,dep[n];

bool bfs()

} }return dep[t];

}int dfs(int x,int flow)

} }return 0;

}void work()

while(bfs())

while(w);

} if(maxflow==n)printf("yes\n");

else printf("no\n");

return;

}int main()

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 顯然目標狀...