| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 | 
|---|---|---|---|---|---|---|---|
| 5031 | cki86201 | 결혼 문제 (IZhO14_marriage) | C++98 | 1500 ms | 2780 KiB | 
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<stdio.h>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
//for 72 point, O(NK+NM lg K);
typedef pair<int,int> Pi;
#define X first
#define Y second
vector <int> E[2020];
int n, m, mat, ans, now, mx;
int xy[30030], yx[2020], prev[30030];
int chk[30030], in;
bool match(int x)
{
	priority_queue <Pi, vector<Pi>, greater<Pi> >pq;
	for(size_t i=0;i<E[x].size();i++){
		if(E[x][i] > now){
			chk[E[x][i]] = in;
			pq.push(Pi(E[x][i],x));
			prev[E[x][i]] = -1;
		}
	}
	while(!pq.empty()){
		Pi tmp = pq.top();
		pq.pop();
		if(!xy[tmp.X]){
			mx = max(mx, tmp.X);
			int s = tmp.X, e = tmp.Y;
			while(e!=-1){
				int save = yx[e];
				xy[s]=e, yx[e]=s;
				e=prev[s], s=save;
			}
			return true;
		}
		int v = xy[tmp.X];
		for(size_t i=0;i<E[v].size();i++){
			if(chk[E[v][i]] == in || E[v][i] <= now)continue;
			chk[E[v][i]] = in;
			pq.push(Pi(E[v][i],v));
			prev[E[v][i]] = tmp.Y;
		}
	}
	return false;
}
int main()
{
	int k, i;
	scanf("%d%d%d",&n,&m,&k);
	for(i=1;i<=k;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		E[y].push_back(x);
	}
	for(i=1;i<=m;i++)if(match(in=i))mat++;
	while(mat==m){
		int t = min_element(yx+1,yx+1+m) - yx;
		ans += (yx[t] - now) * (n - mx + 1);
		now = yx[t];
		xy[yx[t]] = 0, yx[t] = 0, mat--, in++;
		if(match(t))mat++;
	}
	printf("%d",ans);
	return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
