HDU 4322 Candy

本文介绍了一种通过图论和最短路径算法解决特定糖果分配问题的方法,旨在找到一种分配方案,使每个孩子都能获得足够的快乐值。文章详细阐述了使用邻接表表示图结构,并通过SPFA算法寻找增广路径的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ProblemDescription

There are Ncandies and M kids, the teacher will give this N candies to the M kids. Thei-th kids for the j-th candy has a preference for like[i][j], if he like thesugar, like[i][j] = 1, otherwise like[i][j] = 0. If the i-th kids get the candywhich he like he will get K glad value. If he or she do not like it. He willget only one glad value. We know that the i-th kids will feel happy if he thesum of glad values is equal or greater than B[i]. Can you tell me whetherreasonable allocate this N candies, make every kid feel happy.

 

 

Input

The Input consistsof several cases .The first line contains a single integer t .the number oftest cases.
For each case starts with a line containing three integers N, M, K(1<=N<=13, 1<=M<=13, 2<=K<=10)
The next line contains M numbers which is B[i](0<=B[i]<=1000). Separatedby a single space.
Then there are M*N like[i][j] , if the i-th kids like the j-th sugarlike[i][j]=1 ,or like[i][j]=0.

 

 

Output

If there have areasonable allocate make every kid feel happy, output "YES", or"NO".

 

 

Sample Input

2

3 2 2

2 2

0 0 0

0 0 1

 

3 2 2

2 2

0 0 0

0 0 0

 

 

Sample Output

Case #1: YES

Case #2: NO

 

集训期间,实在太累,不写了。。。。。。待到开学再来慢慢写吧

#include <iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>>
#define INF 1000000000
using namespace std;
const int M = 4 * 10010;//边

struct Node//边,点f到点t,流量为c,费用为w
{
	int st, ed;
	int flow, cost;
	int next;
}edge[M];

int head[M], dis[M], q[M], pre[M], cnt;//cnt为已添加的边数,head为邻接表,dis为花费,pre为父亲节点
bool vis[M];
int b[15] ,like[15][15];
int n, m, k;

void init()
{
	memset(head, -1, sizeof(head));
	cnt = 0;
}

void add_edge(int f, int t, int d1, int d2, int w)
{//f到t的一条边,流量为d1,反向流量d2,花费w,反向边花费-w(可以反悔)
	edge[cnt].st = f;
	edge[cnt].ed = t;
	edge[cnt].flow = d1;
	edge[cnt].cost = w;
	edge[cnt].next = head[f];
	head[f] = cnt++;

	edge[cnt].st = t;
	edge[cnt].ed = f;
	edge[cnt].flow = d2;
	edge[cnt].cost = -w;
	edge[cnt].next = head[t];
	head[t] = cnt++;
}

bool spfa(int s, int t, int n)
{
	int i, tmp, l, r;
	memset(pre, -1, sizeof(pre));
	for(i = 0; i < n; ++i)
    {
        dis[i] = INF;
    }
	dis[s] = 0;
	q[0] = s;
	l = 0, r = 1;
	vis[s] = true;
	while(l != r)
    {
		tmp = q[l];
		l = (l + 1) % (n + 1);
		vis[tmp] = false;
		for(i = head[tmp]; i!=-1; i = edge[i].next)
		{
			if(edge[i].flow && dis[edge[i].ed] > dis[tmp] + edge[i].cost)
			{
				dis[edge[i].ed] = dis[tmp] + edge[i].cost;
				pre[edge[i].ed] = i;
				if(!vis[edge[i].ed])
				{
					vis[edge[i].ed] = true;
					q[r] = edge[i].ed;
					r = (r + 1) % (n + 1);
				}
			}
		}
	}
	if(pre[t] == -1)
	{
	    return false;
	}
	return true;
}

void MCMF(int s, int t, int n, int &flow, int &cost)
{//起点s,终点t,点数n,最大流flow,最小花费cost
	int tmp, arg;
	flow = cost = 0;
	while(spfa(s, t, n))
    {
		arg = INF;
		tmp = t;
		while(tmp != s)
		{
			arg = min(arg, edge[pre[tmp]].flow);
			tmp = edge[pre[tmp]].st;
		}
		tmp = t;
		while(tmp != s)
		{
			edge[pre[tmp]].flow -= arg;
			edge[pre[tmp] ^ 1].flow += arg;
			tmp = edge[pre[tmp]].st;
		}
		flow += arg;
		cost += arg * dis[t];
	}
}

int main()
{
    int t ,no ,num[15] ,flag[15];
    int flow ,cost ,sum;
    scanf("%d",&t);
    for(int r = 1;r<=t;r++)
    {
        memset(flag,0,sizeof(flag));
        memset(num,0,sizeof(num));
        sum = 0;
        scanf("%d%d%d",&n,&m,&k);
        for(int i = 1;i<=m;i++)
        {
            scanf("%d",&b[i]);
            sum += b[i];
        }
        no = 1;
        for(int i = 1;i<=m;i++)
        {
            for(int j = 1;j<=n;j++)
            {
                scanf("%d",&like[i][j]);
                if(like[i][j] && !flag[j])
                {
                    num[j] = no++;
                }
            }
        }
        init();
        no = m + no - 1;
        for(int i = 1;i<=m;i++)
        {
            add_edge(0,i,b[i]/k,0,-k);
            if(b[i] % k)
            {
                no++;
                add_edge(0,no,1,0,-(b[i] % k));
            }
            for(int j = 1;j<=n;j++)
            {
                if(like[i][j])
                {
                    add_edge(i,m + num[j],1,0,0);
                    if(b[i] % k)
                    {
                        add_edge(no,m + num[j],1,0,0);
                    }
                }
            }
        }
        no++;
        for(int i = 1;i<=n;i++)
        {
            if(num[i])
            {
                add_edge(m + num[i],no,1,0,0);
            }
        }
        MCMF(0,no,no + 1,flow,cost);
        if(sum + cost > n - flow)
        {
            printf("Case #%d: NO\n",r);
        }
        else
        {
            printf("Case #%d: YES\n",r);
        }
    }
    return 0;
}


 

《餐馆点餐管理系统——基于Java和MySQL的课程设计解析》 在信息技术日益发达的今天,餐饮行业的数字化管理已经成为一种趋势。本次课程设计的主题是“餐馆点餐管理系统”,它结合了编程语言Java和数据库管理系统MySQL,旨在帮助初学者理解如何构建一个实际的、具有基本功能的餐饮管理软件。下面,我们将深入探讨这个系统的实现细节及其所涉及的关键知识点。 我们要关注的是数据库设计。在“res_db.sql”文件中,我们可以看到数据库的结构,可能包括菜品表、订单表、顾客信息表等。在MySQL中,我们需要创建这些表格并定义相应的字段,如菜品ID、名称、价格、库存等。此外,还要设置主键、外键来保证数据的一致性和完整性。例如,菜品ID作为主键,确保每个菜品的唯一性;订单表中的顾客ID和菜品ID则作为外键,与顾客信息表和菜品表关联,形成数据间的联系。 接下来,我们来看Java部分。在这个系统中,Java主要负责前端界面的展示和后端逻辑的处理。使用Java Swing或JavaFX库可以创建用户友好的图形用户界面(GUI),让顾客能够方便地浏览菜单、下单。同时,Java还负责与MySQL数据库进行交互,通过JDBC(Java Database Connectivity)API实现数据的增删查改操作。在程序中,我们需要编写SQL语句,比如INSERT用于添加新的菜品信息,SELECT用于查询所有菜品,UPDATE用于更新菜品的价格,DELETE用于删除不再提供的菜品。 在系统设计中,我们还需要考虑一些关键功能的实现。例如,“新增菜品和价格”的功能,需要用户输入菜品信息,然后通过Java程序将这些信息存储到数据库中。在显示所有菜品的功能上,程序需要从数据库获取所有菜品数据,然后在界面上动态生成列表或者表格展示。同时,为了提高用户体验,可能还需要实现搜索和排序功能,允许用户根据菜品名称或价格进行筛选。 另外,安全性也是系统设计的重要一环。在连接数据库时,要避免SQL注入攻击,可以通过预编译的PreparedStatement对象来执行SQL命令。对于用户输入的数据,需要进行验证和过滤,防止非法字符和异常值。 这个“餐馆点餐管理系统”项目涵盖了Java编程、数据库设计与管理、用户界面设计等多个方面,是一个很好的学习实践平台。通过这个项目,初学者不仅可以提升编程技能,还能对数据库管理和软件工程有更深入的理解。在实际开发过程中,还会遇到调试、测试、优化等挑战,这些都是成长为专业开发者不可或缺的经验积累
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值