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

好心人帮忙看看,为什么总TLE?

Posted by zhangzhenhutemp at 2009-02-13 16:14:19 on Problem 3020
//============================================================================
// Name        : poj_3020.cpp
// Author      : tiger
// Version     :
// Copyright   : 无聊中
// Description :
/*
 * 建图:以'*'为顶点,四个方向相邻的'*'之间建边.
 * 所求答案 = 建图求最大匹配 + 没有匹配数
 */
//============================================================================

#include <iostream>
#include <cstdio>
using namespace std;
#define MAXN 401 //顶点数最多为h*w,即400
#define _clr(x) memset(x,0xff,sizeof(int)*MAXN)
char map[40][10];
int mat[401][401];//图中所有顶点数为h*w,最多为400
int match[MAXN];

int aug(int n,int mat[][MAXN],int* match,int* v,int now){
	int i,ret=0;
	v[now]=1;
	for (i=0;i<n;i++)
		if (!v[i]&&mat[now][i]){
			if (match[i]<0)
				match[now]=i,match[i]=now,ret=1;
			else{
				v[i]=1;
				if (aug(n,mat,match,v,match[i]))
					match[now]=i,match[i]=now,ret=1;
				v[i]=0;
			}
			if (ret)
				break;
		}
	v[now]=0;
	return ret;
}

int graph_match(int n,int mat[][MAXN],int* match){
	int v[MAXN],i,j;
	for (i=0;i<n;i++)
	v[i]=0,match[i]=-1;
	for (i=0,j=n;i<n&&j>=2;)
		if (match[i]<0&&aug(n,mat,match,v,i))
			i=0,j-=2;
		else
			i++;
	for (i=j=0;i<n;i++)
		j+=(match[i]>=0);
	return j/2;
}

int main() {
	//freopen("3020.txt","r",stdin);
	int i,j,n,h,w;//h为行数,w为列数

	int sum;//记录‘*’的个数
	int pipei;//匹配对数

	scanf("%d",&n);
	while( n --)
	{
		memset(map,'o',sizeof(map));//初始化map
		memset(mat,0,sizeof(mat));//初始化mat
		sum = 0;

		scanf("%d%d",&h,&w);
		for(i = 0; i < h; ++i)
		{
			scanf("%s",&map[i]);
			/*for(j = 0; j < w; j ++)
			{
				cin>>map[i][j];
			}*/
		}
		//以下为建图
		for(i = 0; i < h; ++i)
		{

			for(j = 0; j < w; j ++)
			{
				if(map[i][j] == '*')
				{
					sum ++;//统计‘*’的个数
					if(map[i][j + 1] == '*'){
						mat[i*w + j][i*w + j + 1] = 1;
						mat[i*w + j + 1][i*w + j] = 1;//无向图
					}
					if(map[i+1][j] == '*'){
						mat[i*w + j][(i+1)*w + j] = 1;
						mat[(i+1)*w + j][i*w + j] = 1;
					}
				}
			}
		}
		/*for(i = 0; i < h*w; ++i)
		{

			for(j = 0; j < h*w; j ++)
			{
				cout<<mat[i][j]<<" ";
			}
			cout<<endl;
		}*/
		pipei = graph_match(h*w,mat,match);
		printf("%d\n",sum - pipei );

	}

	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