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

📄 南航省赛 optimum item choice.txt

📁 ACM资料大集合
💻 TXT
字号:
#include <stdio.h>
#include <stdlib.h>

#define NMAX 210
#define MAX 99999999
int c[NMAX][NMAX];
int f[NMAX][NMAX];
int q[NMAX*3];
int fa[NMAX]; 
int cost[NMAX];
int income[NMAX];

//南航省赛 Optimum item Choice
void printc(int num)
{
	int i,j;
	for(i=1;i<=num;i++)
	{
		for(j=1;j<=num;j++)
		{
			printf("%d ",c[i][j]);
		}
		printf("\n");
	}
}
void printf(int num)
{
	int i,j;
	for(i=1;i<=num;i++)
	{
		for(j=1;j<=num;j++)
		{
			printf("%d ",f[i][j]);
		}
		printf("\n");
	}
}
int get_maxliu(int start,int end,int num,int ans)
{
	int i,j,qs,qt,min;
	do
	{
		for(i=0;i<=num;i++) {fa[i]=q[i]=0;}
		fa[start]=-1;
		qs=0;qt=1;
		q[qt]=start;
		while(qs<qt && fa[end]==0)
		{
			i=q[++qs];
			for(j=1;j<=num;j++)
			{
				if(fa[j]==0)
				{
					if(c[i][j]>f[i][j])
					{
						q[++qt]=j;
						fa[j]=i;
					}
					else if(f[j][i]>0)
					{
						q[++qt]=j;
						fa[j]=-i;
					}
				}
			}
//			printf("(1)\n");
		}
		if(fa[end]!=0)
		{
			min=MAX;
			for(i=end;i!=start;i=abs(fa[i]))
			{
				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]];
				}
			}
			ans-=min;
			for(i=end;i!=start;i=abs(fa[i]))
			{
				if(fa[i]>0) f[fa[i]][i]+=min;
				else f[i][-fa[i]]-=min;
			}
//			printf(num);
//			system("pause");
//		printf("(2)\n");
		}
	}while(fa[end]!=0);
	return ans;
}

int solve(int num)
{
	int i,jnum,j,start,end,tt,ans=0;
//	printf("begin create\n");
	start=num+1;
	end=num+2;
	num+=2;
	for(i=1;i<=num;i++)
	{
		for(j=1;j<=num;j++)
		{
			f[i][j]=c[i][j]=0;
		}
	}
//	printf("begin create\n");
	for(i=1;i<=num-2;i++) scanf("%d",&cost[i]);
	for(i=1;i<=num-2;i++) scanf("%d",&income[i]);
//	printf("begin create\n");
	for(i=1;i<=num-2;i++)
	{
//		printf("%d:    %d\n end=%d",i,income[i]-cost[i],end);
		if(income[i]-cost[i]>0) 
		{
			c[start][i]=income[i]-cost[i];
			ans+=c[start][i];
		}
		else c[i][end]=cost[i]-income[i];
	}
	for(i=1;i<=num-2;i++)
	{
		scanf("%d",&jnum);
		for(j=1;j<=jnum;j++)
		{
			scanf("%d",&tt);
			c[i][tt]=MAX;
		}
	}
//	printc(num);
//	printf("create!\n");
//	system("pause");
	return get_maxliu(start,end,num,ans);
}

int main()
{
	int num,cnum=0;
	freopen("choice.in","r",stdin);
	freopen("choice.out","w",stdout);	
	while(scanf("%d",&num)!=EOF)
	{
		cnum++;
		printf("Case %d: %d\n",cnum,solve(num));
	}
}

⌨️ 快捷键说明

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