Điểm:
2000 (p)
Thời gian:
1.0s
Bộ nhớ:
512M
Input:
bàn phím
Output:
màn hình
Cho một ma trận \(n × n\), và nhiệm vụ của bạn là chọn từ mỗi hàng và mỗi cột một số ô.
Input
- Dòng đầu tiên chứa số nguyên \(n\): kích thước của lưới. Các hàng và cột được đánh số \(1,2,…, n\).
- Dòng tiếp theo chứa \(n\) số nguyên \(a_1, a_2,…, a_n\): Bạn phải chọn chính xác \(a_i\) ô từ hàng thứ \(i\).
- Dòng tiếp theo chứa \(n\) số nguyên \(b_1, b_2,…, b_n\): Bạn phải chọn chính xác \(b_j\) ô từ hàng thứ \(j\).
Output
- In \(n\) dòng mô tả bạn chọn ô nào (\(X\) nghĩa là bạn chọn ô đấy, \(.\) nghĩa là bạn không chọn).
- Nếu không có cách chọn, in một số \(-1\)
Constraints
- \(1\leq n \leq 50\)
- \(1\leq a_i \leq n\)
- \(1\leq b_j \leq n\)
Example
Sample input
5
0 1 3 2 0
1 2 2 0 1
Sample output
.....
..X..
.XX.X
XX...
.....
Bình luận
include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
const int maxN = 105, maxM = 2605;
const int INF = 0x3f3f3f3f;
int N, rowTot, colTot, edgeID, p[maxN], cap[maxN][maxN];
bool vis[maxM];
vector<int> path, F[maxN];
vector<pii> G[maxN];
int bfs(int s = 0, int t = 2N+1){
fill(p, p+2N+2, -1);
p[s] = -2;
}
void dfs(int u = 0){
path.push_back(u);
if(u == N) return;
for(pii e : G[u]){
int v = e.first;
int id = e.second;
if(cap[u][v] == 0 && !vis[id]){
vis[id] = true;
dfs(v);
return;
}
}
}
int maxflow(int s = 0, int t = 2*N+1){
int flow = 0, aug = 0;
while(aug = bfs()){
flow += aug;
int u = t;
while(u != s){
int v = p[u];
cap[v][u] -= aug;
cap[u][v] += aug;
u = v;
}
}
return flow;
}
int main(){
scanf("%d", &N);
for(int i = 1, c; i <= N; i++){
scanf("%d", &c);
G[0].push_back({i, ++edgeID});
F[0].push_back(i);
F[i].push_back(0);
cap[0][i] += c;
rowTot += c;
}
for(int i = N+1, c; i <= 2N; i++){
scanf("%d", &c);
G[i].push_back({2N+1, ++edgeID});
F[i].push_back(2N+1);
F[2N+1].push_back(i);
cap[i][2N+1] += c;
colTot += c;
}
for(int i = 1; i <= N; i++){
for(int j = N+1; j <= 2N; j++){
G[i].push_back({j, ++edgeID});
F[i].push_back(j);
F[j].push_back(i);
cap[i][j]++;
}
}
}
1 bình luận nữa