Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

没抄模板1A:) 贴代码还算短不到2k

Posted by qddpx at 2012-08-10 10:19:20 on Problem 3436
#include <cstdio>
#include <cstring>
#define MN 105
#define MP 10
#define INF 99999999

int p, n, st[MN][MP], nn, mat[MN][MN], flow[MN][MN];

int maxflow() {
	int q[MN], p[MN], m[MN], h, t, c, i, f;
	while(1) {
		c = h = t = 0, q[t++] = 0, m[0] = INF;
		memset(p, 0, sizeof(p));
		while(h < t) {
			if((c = q[h++]) == 1) break;
			for(i = 0; i < nn; i++) {
				if(!p[i] && (f = mat[c][i]-flow[c][i]))
					p[i] = c + 1, q[t++] = i, m[i] = (f<m[c])?f:m[c];
				else if(!p[i] && (f = flow[i][c]))
					p[i] = -c - 1, q[t++] = i, m[i] = (f<m[c])?f:m[c];
			}
		}
		if(c != 1) break;
		while(c) {
			if(p[c] > 0)
				flow[p[c]-1][c] += m[1], c = p[c]-1;
			else
				flow[c][-p[c]-1] -= m[1], c = -p[c]-1;
		}
	}
	for(f = i = 0; i < nn; i++)
		f += flow[0][i];
	return f;
}

int compstate(int fr, int to) {
	int i;
	for(i = 0; i < p; i++)
		if(st[to][i] != 2 && st[fr][i] != st[to][i])
			break;
	return (i == p);
}

int main() {
	int i, j, k, u, v, q;
	freopen("input.txt", "r", stdin);
	scanf("%d%d", &p, &n);
	memset(mat, 0, sizeof(mat));
	for(nn = 2, k = 0; k < 2; k++) 
		for(j = 0; j < p; j++)
			st[k][j] = k;
	for(i = 1; i <= n; i++) {
		scanf("%d", &q);
		for(k = 0; k < 2; k++, nn++)
			for(j = 0; j < p; j++)
				scanf("%d", &st[nn][j]);
		u = nn-2, v = nn-1, mat[u][v] = q;
		if(compstate(0, u))
			mat[0][u] = INF;
		if(compstate(v, 1))
			mat[v][1] = INF;
	}
	for(i = 1; i <= n; i++)
		for(j = 1; j <= n; j++)
			if(i != j && compstate(2*i+1, 2*j))
				mat[2*i+1][2*j] = INF;
	memset(flow, 0, sizeof(flow));
	printf("%d ", maxflow());
	for(k = 0, i = 3; i < nn; i += 2)
		for(j = 2; j < nn; j += 2)
			if(flow[i][j])
				k++;
	printf("%d\n", k);
	for(i = 3; i < nn; i += 2)
		for(j = 2; j < nn; j += 2)
			if(flow[i][j])
				printf("%d %d %d\n", i/2, j/2, flow[i][j]);
	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator