Matrix Gym - 100741F 匈牙利算法(最大二分图匹配)
2017-08-22 22:04
411 查看
用对角线匹配可选值
#include <iostream>
#include <string>
#include <cstring>
#include <vector>
#include <set>
#include <stack>
#include <algorithm>
#include <iterator>
#include <queue>
#include <cmath>
#include <map>
#include <cstdio>
using namespace std;
#define maxn (300 + 7)
#define INF 0x3f3f3f3f
int n;
int mp[maxn][maxn];
vector<int> a[3*maxn];
map<int, int> f;
set<int> st;
int ans[maxn*3];
int solve(int id) {
//cout << " 56565 " << endl;
for(int i = 0; i < a[id].size(); ++i) {
int t = a[id][i];
if(st.count(t) == 0) {
st.insert(t);
if(f[t] == 0 || solve(f[t])) {
f[t] = id;
ans[id] = t;
return 1;
}
}
}
return 0;
}
int main() {
scanf("%d", &n);
for(int i = 0; i < n; ++i) {
for(int j = 0; j < n; ++j)
scanf("%d", &mp[i][j]);
}
int id = 1;
for(int i = n-1; i >= 0;--i) {
int t = i;
for(int j = 0; t < n;) {
a[id].push_back(mp[t][j]);
t++; j++;
}
id++;
}
for(int j = 1; j < n; ++j) {
int t = j;
for(int i = 0; t < n ; ) {
a[id].push_back(mp[i][t]);
i++; t++;
}
id++;
}
int m = id-1;
int cnt = 0;
f.clear();
for(int i = 1; i <= m; ++i) {
st.clear();
if(solve(i)) cnt++;
}
//cout << " +++ " << endl;
if(cnt == 2*n - 1) {//cout << " 2333 duile" << endl;
cout << "YES";
for(int i = 1; i <= m; ++i) {
cout << " " << ans[i];
}
}
else puts("NO");
return 0;
}
#include <iostream>
#include <string>
#include <cstring>
#include <vector>
#include <set>
#include <stack>
#include <algorithm>
#include <iterator>
#include <queue>
#include <cmath>
#include <map>
#include <cstdio>
using namespace std;
#define maxn (300 + 7)
#define INF 0x3f3f3f3f
int n;
int mp[maxn][maxn];
vector<int> a[3*maxn];
map<int, int> f;
set<int> st;
int ans[maxn*3];
int solve(int id) {
//cout << " 56565 " << endl;
for(int i = 0; i < a[id].size(); ++i) {
int t = a[id][i];
if(st.count(t) == 0) {
st.insert(t);
if(f[t] == 0 || solve(f[t])) {
f[t] = id;
ans[id] = t;
return 1;
}
}
}
return 0;
}
int main() {
scanf("%d", &n);
for(int i = 0; i < n; ++i) {
for(int j = 0; j < n; ++j)
scanf("%d", &mp[i][j]);
}
int id = 1;
for(int i = n-1; i >= 0;--i) {
int t = i;
for(int j = 0; t < n;) {
a[id].push_back(mp[t][j]);
t++; j++;
}
id++;
}
for(int j = 1; j < n; ++j) {
int t = j;
for(int i = 0; t < n ; ) {
a[id].push_back(mp[i][t]);
i++; t++;
}
id++;
}
int m = id-1;
int cnt = 0;
f.clear();
for(int i = 1; i <= m; ++i) {
st.clear();
if(solve(i)) cnt++;
}
//cout << " +++ " << endl;
if(cnt == 2*n - 1) {//cout << " 2333 duile" << endl;
cout << "YES";
for(int i = 1; i <= m; ++i) {
cout << " " << ans[i];
}
}
else puts("NO");
return 0;
}
相关文章推荐
- poj2239 Selecting Courses(最大二分图匹配 (匈牙利算法) 实现 )
- 【二分图匹配】最大匹配-匈牙利算法BFS && DFS写法
- HDU - 1150 Machine Schedule 最小点覆盖(最大二分图匹配-匈牙利算法)邻接表写法
- UVA 12168 Cat vs. Dog(二分图匹配+匈牙利算法+最大独立集+数据转化)
- 【二分图匹配】最大二分匹配——匈牙利算法
- 最大二分图匹配(匈牙利算法)
- nyoj 239 月老的难题 (最大二分图匹配匈牙利算法)
- 过山车(匈牙利算法,最大二分图匹配)
- 二分图匹配之最大匹配——匈牙利算法
- 【二分图匹配入门专题1】F - COURSES poj1469【最大匹配--匈牙利算法模板题】
- codevs 1922 骑士共存问题||二分图||最大独立集||二分图匹配||Dinic与匈牙利算法的讨论||网络流
- hdu 1068 zoj 1137 poj 1466 Girls and Boys(二分图匹配 匈牙利算法 最大独立集)
- Poj1325 Machine Schedule 最大二分图匹配 匈牙利算法
- 最大二分图匹配(匈牙利算法)
- NYOJ 月老的难题 (最大二分图匹配,匈牙利算法)
- HDU 1068 Girls and Boys(二分图匹配+最大独立集+匈牙利算法)
- 匈牙利算法 最大二分图匹配
- POJ1274 匈牙利算法 最大二分图匹配入门模板
- HDU 2063 最大二分图匹配 匈牙利算法
- NYOJ 月老的难题 (最大二分图匹配,匈牙利算法)