⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 noj 1044 dining.txt

📁 ACM资料大集合
💻 TXT
字号:
//#include <iostream>
#include <stdio.h>
//include <algorithm>
#include <math.h>
#include <stdlib.h>
#include <time.h>
//using namespace std;

//NOJ 1044 Dining
//增广路 预留推进
#define DIANMAX 420
#define NMAX 102
#define MAX 100
#define FMAX 102
#define DMAX 102

/*
4 5 1 4
1 2 6
1 3 5
2 3 2
2 4 5
3 4 9


4 5 1 4
1 2 6
1 3 4
2 3 3
2 4 4
3 4 8

4 5 1 4
1 2 7
1 3 2
2 3 3
2 4 1
3 4 5

输出:
11
10
6
*/
int F_like[NMAX];
int D_like[NMAX];
int F_i[NMAX][FMAX];
int D_i[NMAX][DMAX];
int high[DIANMAX];

int c[DIANMAX][DIANMAX];
int fa[DIANMAX];//??????????,????????????????????????????????????????????????????????????????
int f[DIANMAX][DIANMAX];//??????????????????
int q[DIANMAX*100];//????
int e[DIANMAX];
int h[DIANMAX];

void init(int num)
{
	int i,j;
	for(i=1;i<=num;i++)
	{
		for(j=1;j<=num;j++)
		{
			f[i][j]=0;
			c[i][j]=0;
		}
	}
}

void print(int num)
{
	int i,j;
	for(i=1;i<=num;i++)
	{
		for(j=1;j<=num;j++)
		{
			printf("%2d",f[i][j]);
		}
		printf("\n");
	}
}

int get_maxliu(int start,int end,int num)
{
	int flag,has,i,tt,j,min;
	
	for(i=1;i<=num;i++)
	{
		e[i]=0;
		h[i]=0;
	}
	h[start]=num;
	for(i=1;i<=num;i++)
	{
		if(c[start][i]>0)
		{
			e[start]-=c[start][i];
			e[i]+=c[start][i];
			f[start][i]=c[start][i];
			f[i][start]=-c[start][i];
		}
	}
	flag=1;
	while(flag==1)
	{
		flag=0;
		for(i=1;i<=num;i++)
		{
			if(e[i]>0&&i!=end)
			{
				flag=1;has=0;min=MAX*MAX;
				for(j=1;j<=num;j++)
				{
					if(c[i][j] > f[i][j])
					{
						if(h[i]==h[j]+1)
						{
							has=1;
							if(c[i][j]-f[i][j]<e[i]) tt=c[i][j]-f[i][j];
							else tt=e[i];
							e[i]-=tt;
							e[j]+=tt;
							f[i][j]+=tt;
							f[j][i]-=tt;							
						}
						else
						{
							if(min>h[j]+1) min=h[j]+1;
						}
					}
				}
				if(has==0) h[i]=min;
			}
		}
	}
	return e[end];
}

/*
int get_maxliu(int start,int end,int num)
{
	int ans=0,i,j,qs,qt,min;
	fa[end]=1;
	int k=0;
	while(fa[end]!=0)
	{
		for(i=0;i<=num;i++)
		{
			fa[i]=q[i]=0;
		}
		fa[start]=-1;
		qs=0;qt=1;
		q[qt]=start;
//		printf("(1) %d\n",++k);
		while(qs<qt && fa[end]==0)
		{
			i=q[++qs];
//			printf("(2) i=%d\n",i);
			for(j=1;j<=num;j++)
			{
				if(fa[j]==0)
				{
					if(c[i][j]>f[i][j]) 
					{
						q[++qt]=j;
						fa[j]=i;
//						printf("(3) j=%d\n",j);
					}
					else if(f[j][i]>0)
					{
						q[++qt]=j;
						fa[j]=-i;
//						printf("(3) j=%d\n",j);
					}
				}
			}
//			printf("(4) find qian qu\n");
//			system("pause");
		}
		if(fa[end]!=0)
		{
			min=MAX;
			i=end;
			while(i!=start)
			{
				if(fa[i]>0)
				{
					if(min>c[fa[i]][i]-f[fa[i]][i]) min=c[fa[i]][i]-f[fa[i]][i];
				}
				else
				{
					if(min>f[i][fa[i]]) min=f[i][-fa[i]];
				}
				i=abs(fa[i]);
			}
			ans+=min;
			i=end;
			while(i!=start)
			{
				if(fa[i]>0) f[fa[i]][i]+=min;
				else f[i][-fa[i]]-=min;
				i=abs(fa[i]);
			}
		}
//		system("pause");
	}
	return ans;
}
*/
int create(int N,int F,int D)
{
    int start,food,drink,end,i,j,cowf,cowd;
    start=food=1;
    cowf=food+F;
    cowd=cowf+N;
    drink=cowd+N;
    end=drink+D+1;
    for(i=1;i<=F;i++)
        c[start][start+i]=1;
    for(i=1;i<=N;i++)
    {
        for(j=1;j<=F_like[i];j++)
            c[F_i[i][j]+food][cowf+i]=1;
        for(j=1;j<=D_like[i];j++)
            c[cowd+i][D_i[i][j]+drink]=1;
    }
    for(i=1;i<=N;i++)
        c[cowf+i][cowd+i]=1;
    for(i=1;i<=D;i++)
        c[drink+i][end]=1;
    return end;
}

int main()
{
    int N,F,D,i,j,huidian;
    scanf("%d%d%d",&N,&F,&D);
    for(i=1;i<=N;i++)
    {
        scanf("%d%d",&F_like[i],&D_like[i]);
        for(j=1;j<=F_like[i];j++)
            scanf("%d",&F_i[i][j]);
        for(j=1;j<=D_like[i];j++)
            scanf("%d",&D_i[i][j]);
    }
    huidian=create(N,F,D);
    printf("%d\n",get_maxliu(1,huidian,huidian));
    return 0;
}
/*


int main()
{
	int num,pnum,i,ta,tb,tc,start,end;
	while(scanf("%d%d%d%d",&num,&pnum,&start,&end)!=EOF)
	{
		init(num);
		for(i=0;i<pnum;i++) 
		{
			scanf("%d%d%d",&ta,&tb,&tc);
			c[ta][tb]=tc;
		}
		printf("%d\n",get_maxliu(start,end,num));
	}
	return 0;
}

*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -