这是一个简单的匈牙利算法的应用,不是很难理解,套上匈牙利算法的板子很容易,所以说,要的就是匈牙利算法这个板子
以前写过一个匈牙利算法的题,但是没太理解,昨天找了一个题,先凭着自己的理解 写了一遍,虽然过了样例,但是自己就感觉不对,
然后在看 匈牙利算法的板子,觉得理解的很透彻了,,,,then 改这个题,写完以后 蜜汁过不了样例,对着板子看,没错啊,写的还可以啊,,刚刚又看了一遍,原来最开始的时候就开错了 一个数组,,m d z z 。 。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int maxn = 100000 + 7;
int m[maxn], v[65], vis[maxn];
int T, n, min_, max_;
struct node {
int l, r;
}b[65];
void init() {
memset(m, 0, sizeof m);
memset(v, 0, sizeof v);
scanf("%d", &n);
for(int i = 1; i <= n; ++i)
scanf("%d%d", &b[i].l, &b[i].r);
}
bool find_(int s) {
for(int j = b[s].l; j <= b[s].r; ++j) {
if(!vis[j]) {
vis[j] = 1;
if(m[j] == 0 || find_(m[j])) {
m[j] = s;
v[s] = j;
return true;
}
}
}
return false;
}
void solve() {
int cnt = 0;
for(int i = n; i >= 1; --i) {
memset(vis, 0, sizeof vis);
if(find_(i)) cnt++;
}
cout << cnt << endl;
int f = 0;
for(int i = 1; i <= n; ++i) {
if(v[i]) {
if(f) cout << " " << i ;
else { cout << i; f = 1; }
}
}
cout << endl;
}
int main() {
scanf("%d", &T);
while(T--) {
init();
solve();
}
return 0;
}