匈牙利算法 18pts 萌新求解
查看原帖
匈牙利算法 18pts 萌新求解
111016
S1gMa楼主2020/8/21 14:00
#include <bits/stdc++.h>
using namespace std;

const int maxx = 1001;
int line[maxx][maxx], used[maxx], nxt[maxx];
int u, v, n, m, e;
int u1[10001], v1[10001];
int z = 1, j; 
bool Find(int x) {
	for (j = 1; j <= m - n; j++) {
		if (line[x][j] && !used[j]) {
			used[j] = 1;
			if (nxt[j] == 0 || Find(nxt[j])) {
				nxt[j] = x;
				return true;
			}
		}
	}
	return false;
}

int match() {
	int sum = 0;
	for (int i = 1; i <= n; i++) {
		memset(used, 0, sizeof(used));
		if (Find(i)) {
			sum++;
			u1[z] = i;
			v1[z] = j;
			z++;
		}

	}
	return sum;
}

int main() {
	// freopen("1 (2).in", "r", stdin);
	//  freopen("1 (2).out", "w", stdout);
	ios::sync_with_stdio(false);
	cin >> n >> m;
	memset(nxt, 0, sizeof(nxt));
	memset(line, 0, sizeof(line));
	while(1) {
		cin >> u >> v;
		if(u == -1 && v == -1)
			break;
		v = v - n;
		line[u][v] = 1;

	}
	int ans = match();
	cout << ans << endl;
	for(int i = 1; i <= ans; i++)
		cout << u1[i] << " " << v1[i] + n << endl;	
	return 0;
}

看到spj就直接写了个匈牙利算法。。。 只对了1, 3测试点

2020/8/21 14:00
加载中...