HDU3572-网络流。。。不会建图

本文探讨了如何使用网络流算法解决任务调度问题,通过构建特定的图模型,确保在有限的机器资源下,所有任务能在规定时间内完成。介绍了算法的具体实现过程,包括建图、最大流计算等关键步骤。

Task Schedule
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 12417 Accepted Submission(s): 3771

Problem Description
Our geometry princess XMM has stoped her study in computational geometry to concentrate on her newly opened factory. Her factory has introduced M new machines in order to process the coming N tasks. For the i-th task, the factory has to start processing it at or after day Si, process it for Pi days, and finish the task before or at day Ei. A machine can only work on one task at a time, and each task can be processed by at most one machine at a time. However, a task can be interrupted and processed on different machines on different days.
Now she wonders whether he has a feasible schedule to finish all the tasks in time. She turns to you for help.

Input
On the first line comes an integer T(T<=20), indicating the number of test cases.

You are given two integer N(N<=500) and M(M<=200) on the first line of each test case. Then on each of next N lines are three integers Pi, Si and Ei (1<=Pi, Si, Ei<=500), which have the meaning described in the description. It is guaranteed that in a feasible schedule every task that can be finished will be done before or at its end day.

Output
For each test case, print “Case x: ” first, where x is the case number. If there exists a feasible schedule to finish all the tasks, print “Yes”, otherwise print “No”.

Print a blank line after each test case.

Sample Input

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

2 2
2 1 3
1 2 2

Sample Output

Case 1: Yes

Case 2: Yes
题意:就是说某人有m个机器人,n个任务,之后给出每个任务的开始时间和最迟结束时间,还有一个任务完成需要的时间。问能不能再规定时间内完成所有的任务
思路:先建图。。。。但是一开始建图都不会,然后去看了下博客才知道怎么建图。首先0是起点,之后连接每个任务,任务连接从开始时间到结束时间的每个时间点,最后时间点连接终点。然后用网络流最大流就行了,每个任务所需的时间和是最大流就是Yes。
AC代码:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn=1000000+10;
const int INF=0x7f7f7f7f;
struct Node
{
	int end,value,next;
}map[maxn];
int head[maxn],n,m,start,index,sum;
int Max,End;
int flow[maxn],pre[maxn];
void Init()
{
	sum=0;index=0;Max=-1;start=0;
	memset(head,-1,sizeof(head));
	return ;
}
void addedge(int start,int end,int value)
{
	map[index].end=end;
	map[index].value=value;
	map[index].next=head[start];
	head[start]=index++;
	map[index].next=head[end];
	map[index].value=value;
	map[index].end=start;
	head[end]=index++;
	return ;
}
bool bfs()
{
	queue<int> q;
	q.push(start);
	memset(pre,-1,sizeof(pre));
	pre[start]=0;
	while (!q.empty())
		{
			int now=q.front();
			q.pop();
			for (int i=head[now];i!=-1;i=map[i].next)
				if (pre[map[i].end]<0&&map[i].value>0)
					{
						pre[map[i].end]=pre[now]+1;	//注意这里要+1,不然会超内存
						q.push(map[i].end);
					}
		}
	return pre[End]!=-1;
}
int dfs(int now,int flow)
{
	int deta=0,temp=0;
	if (now==End)
		return flow;
	for (int i=head[now];i!=-1;i=map[i].next)
		if (map[i].value>0&&pre[now]==pre[map[i].end]-1)
			{
				temp=dfs(map[i].end,min(flow-deta,map[i].value));
				if (temp>0)
					{
						map[i].value-=temp;
						map[i^1].value+=temp;
						deta=deta+temp;
						if (deta==flow) break;
					}
				else pre[map[i].end]=-1;
			}
	return deta;
}
int dinic()
{
	int ans=0,flow=0;
	while (bfs())
		ans=ans+dfs(0,INF);
	return ans;
}
int main()
{
	int pi,si,ei;
	int t,k=1;
	cin>>t;
	while (t--)
		{
			cin>>n>>m;
			Init();
			for (int i=1;i<=n;i++)
				{
					scanf("%d%d%d",&pi,&si,&ei);
					sum=sum+pi;
					Max=max(Max,ei);
					addedge(start,i,pi);
					for (int j=si;j<=ei;j++)
						addedge(i,j+n,1);
				}
			End=n+Max+1;
			for (int i=1;i<=Max;i++)
				addedge(i+n,End,m);
			int ans=dinic();
			printf("Case %d: ",k++);
			if (ans!=sum) cout<<"No"<<endl;
			else cout<<"Yes"<<endl;
			cout<<endl;
		}
	return 0;
}
本课题设计了一种利用Matlab平台开发的植物叶片健康状态识别方案,重点融合了色彩与纹理双重特征以实现对叶片病害的自动化判别。该系统构了直观的形操作界面,便于用户提交叶片影像并快速获得分析结论。Matlab作为具备高效数值计算与数据处理能力的工具,在像分析与模式分类领域应用广泛,本项目正是借助其功能解决农业病害监测的实际问题。 在色彩特征分析方面,叶片影像的颜色分布常与其生理状态密切相关。通常,健康的叶片呈现绿色,而出现黄化、褐变等异常色彩往往指示病害或虫害的发生。Matlab提供了一系列像处理函数,例如可通过色彩空间转换与直方统计来量化颜色属性。通过计算各颜色通道的统计参数(如均值、标准差及主成分等),能够提取具有判别力的色彩特征,从而为不同病害类别的区分提供依据。 纹理特征则用于描述叶片表面的微观结构与形态变化,如病斑、皱缩或裂纹等。Matlab中的灰度共生矩阵计算函数可用于提取对比度、均匀性、相关性等纹理指标。此外,局部二值模式与Gabor滤波等方法也能从多尺度刻画纹理细节,进一步增强病害识别的鲁棒性。 系统的人机交互界面基于Matlab的形用户界面开发环境实现。用户可通过该界面上传待检像,系统将自动执行像预处理、特征抽取与分类判断。采用的分类模型包括支持向量机、决策树等机器学习方法,通过对已标注样本的训练,模型能够依据新像的特征向量预测其所属的病害类别。 此类课题设计有助于深化对Matlab编程、像处理技术与模式识别原理的理解。通过完整实现从特征提取到分类决策的流程,学生能够将理论知识与实际应用相结合,提升解决复杂工程问题的能力。总体而言,该叶片病害检测系统涵盖了像分析、特征融合、分类算法及界面开发等多个技术环节,为学习与掌握基于Matlab的智能检测技术提供了综合性实践案例。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值