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

先WA了几次都不过,后来加了一个贪心(aPath),其他的都没动就过了,为什么?

Posted by PC0400322032 at 2004-07-30 02:39:01 on Problem 1698
#include <iostream.h>
#include <string.h>
#include <limits.h>
#define Max 400 
struct node
{
	bool mark,check; 
    int parse,min; 
}g[Max]; 
int n,k,c[Max][Max],a[Max][Max];
bool FindLink(); 
void Extend();
void aPath(); 
int MaxFlow() 
{ 
    int i,sum; 
    memset(a,0,sizeof(a));
	aPath();
    while(FindLink()) 
        Extend(); 
    for(i=1,sum=0;i<=n;i++) 
        sum+=a[i][n+1]; 
    return sum; 
} 
void aPath()
{
	int i,j;
	for(i=2;i<=k+1;i++)
		for(j=k+2;j<n;j++)
		{
			if(a[j][n]>=1 || c[i][j]==0)
				continue;
			a[i][j]++;
			a[j][n]++;
			a[n][n+1]++;
			a[1][i]++;
			if(a[1][i]>=c[1][i])
				break;
		}
}


bool FindLink() 
{ 
    int i,x; 
    for(i=0;i<=n+1;i++) 
        g[i].mark=g[i].check=false; 
    x=0;g[0].mark=true;g[0].min=INT_MAX; 
    while(x<=n+1) 
    { 
        for(i=0;i<=n+1;i++) 
        { 
            if(!g[i].mark&&a[x][i]<c[x][i]) 
            { 
                g[i].mark=true;g[i].parse=x; 
                g[i].min=( (g[x].min<c[x][i]-a[x][i])?g[x].min:(c[x][i]-a[x][i]) ); 
                if(i==n+1) return true; 
            } 
        } 
        for(i=0;i<=n+1;i++) 
        { 
            if(!g[i].mark&&a[i][x]>0) 
            { 
                g[i].mark=true;g[i].parse=-x; 
                g[i].min=( (g[x].min<a[i][x])?g[x].min:a[i][x] ); 
                if(i==n+1) return true; 
            } 
        } 
        g[x].check=true; 
        for(x=0;x<=n+1;x++) 
            if(g[x].mark&&!g[x].check) 
                break; 
    } 
    return false; 
} 

void Extend() 
{ 
    int i,j; 
    int min=g[n+1].min;
    for(i=n+1;i>0;i=j) 
    { 
        if(g[i].parse>=0) 
        { 
            j=g[i].parse;a[j][i]+=min; 
        } 
        else 
        { 
            j=-g[i].parse;a[j][i]-=min; 
        } 
    } 
} 
int main()
{
    int i,j,t,d,w,max,tl;
	int f[8];
	cin>>t;
	while(t--)
	{
		cin>>k;
		max=0;tl=0;
		memset(c,0,sizeof(c)); 
		c[0][1]=INT_MAX;
		for(i=2;i<=k+1;i++)
		{
			
			for(j=1;j<8;j++)
				cin>>f[j];
			cin>>d>>w;
			c[1][i]=d;
			tl+=d;
			if(w>max)
				max=w;
			for(j=0;j<w;j++)
				for(int l=1;l<8;l++)
					if(f[l])
						c[i][j*7+k+1+l]+=1;
		}
		n = max*7+k+2;		
		for(i=k+2;i<n;i++)
			c[i][n]=1;
        c[n][n+1]=INT_MAX;
		if(MaxFlow()>=tl)
			cout<<"Yes"<<endl;
		else
			cout<<"No"<<endl;
    }
	return 1;
}

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