题意:
有M个任务,其中两个任务在满足一定的条件下可以由一个人执行,求执行完这M个任务最少需要多少人。
思路:
主要是描述“一定的条件”:对任务m1,m2来说,这一定的条件是指m1的开始时间+m1的执行时间+m1,m2两任务执行街区之间的花费时间<=m2的开始时间,注意任意两街区之间的花费时间要用floyd求出最小值。
代码:
//poj 3216
//sepNINE
#include <iostream>
using namespace std;
const int maxM=256;
const int maxQ=32;
int m,v1,v2;
bool g[maxM][maxM];
bool vis[maxM];
int link[maxM];
int cityMap[maxM][maxM];
int p[maxM],t[maxM],d[maxM];
bool dfs(int x)
{
for(int y=1;y<=v2;++y)
if(g[x][y]&&!vis[y]){
vis[y]=true;
if(link[y]==0||dfs(link[y])){
link[y]=x;
return true;
}
}
return false;
}
void hungary()
{
for(int x=1;x<=v1;++x){
memset(vis,false,sizeof(vis));
if(dfs(x))
++m;
}
return ;
}
int main()
{
int Q,M;
while(scanf("%d%d",&Q,&M)){
if(Q==M&&Q==0)
break;
memset(g,false,sizeof(g));
memset(link,0,sizeof(link));
int i,j,k;
for(i=1;i<=Q;++i)
for(j=1;j<=Q;++j)
scanf("%d",&cityMap[i][j]);
for(k=1;k<=Q;++k)
for(i=1;i<=Q;++i)
for(j=1;j<=Q;++j)
if(cityMap[i][k]!=-1&&cityMap[k][j]!=-1){
if(cityMap[i][j]==-1)
cityMap[i][j]=cityMap[i][k]+cityMap[k][j];
else
cityMap[i][j]=min(cityMap[i][j],cityMap[i][k]+cityMap[k][j]);
}
for(i=1;i<=M;++i)
scanf("%d%d%d",&p[i],&t[i],&d[i]);
for(i=1;i<=M;++i)
for(j=1;j<=M;++j)
if(i!=j&&cityMap[p[i]][p[j]]!=-1&&t[i]+d[i]+cityMap[p[i]][p[j]]<=t[j])
g[i][j]=1;
v1=v2=M;
m=0;
hungary();
printf("%d\n",M-m);
}
return 0;
}
本文介绍了一个基于任务开始时间、执行时间和任务间转移成本的任务分配问题,并通过Floyd算法优化路径成本,采用匈牙利算法求解最少人员配置,实现高效的任务调度。
2923

被折叠的 条评论
为什么被折叠?



