博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ3216 最小路径覆盖
阅读量:4683 次
发布时间:2019-06-09

本文共 1391 字,大约阅读时间需要 4 分钟。

    首先说一下题意,Q个区域,M个任务,每个区域任务可能有多个,然后给你个到各地所需时间的矩阵,每个任务都有开始和持续时间,问最少需要多少工人? 每个工人只能同时执行一个任务。

通过题意,我的瞬间反应就是先把点拆开再说,因为每个区域可能有多个任务,所以把每个任务都当做一点处理,之后就需要考虑一件事情,一个工人在Qi区域做完之后是不是应该去一个离他最近且正好有任务的地方Qj,那么他从Qi到Qj是不是应该走最近的路线? 下一步就出来了,求出所有区域之间的最短距离,用floyd一键搞定。然后就可以建图(有向的)了,把能衔接起来的任务统统连上,按照上一个任务的开始时间+持续时间+到下一点的时间<=下一点的开始时间来连边(不用换区域的到下一点的时间为零),那么此时的问题就变成了多少个工人能把图走完?  即最小路径覆盖,直接匈牙利算法搞定。

   好了上代码

1 #include
2 #include
3 #include
4 #include
5 #define maxn 500 6 #define inf 0xfffffff 7 using namespace std; 8 9 struct edge 10 { 11 int pos,realpos,start,need; 12 }rela[maxn]; 13 vector
q[maxn]; 14 int mize[maxn][maxn],point[maxn]; 15 int vis[maxn],link[maxn]; 16 int n,m,sum; 17 void init() 18 { 19 for(int i=0;i<=maxn;i++) 20 q[i].clear(); 21 memset(rela,0,sizeof(rela)); 22 memset(mize,0,sizeof(mize)); 23 memset(point,0,sizeof(point)); 24 for(int a=1;a<=n;a++) 25 for(int b=1;b<=n;b++) 26 { 27 scanf("%d",&mize[a][b]); 28 if(mize[a][b]==-1) mize[a][b]=inf; 29 } 30 31 for(int c=1;c<=m;c++) 32 { 33 scanf("%d %d %d",&rela[c].pos,&rela[c].start,&rela[c].need); 34 int p=0; 35 for(int d=1;d
View Code

 

转载于:https://www.cnblogs.com/liboyan/p/4390583.html

你可能感兴趣的文章
hashCode()
查看>>
Docker容器学习与分享03
查看>>
phpmyadmin万能密码
查看>>
缓存 - 浏览器缓存
查看>>
html td 限制 高度 和 宽度
查看>>
mysql查询一个表的字段,添加或修改到另外一个表的数据
查看>>
数据库词典设计
查看>>
CL.exe的 /D 选项, Preprocessor Macro预处理器宏定义
查看>>
[Pytorch]Pytorch中tensor常用语法
查看>>
ZOJ 1008 Gnome Tetravex
查看>>
android从内部存储写入、安装apk提示解析包错误,或者提示Permission Denied,文件不可用解决办法...
查看>>
Jenkin远程部署Tomcat8.5总结
查看>>
js复制对象
查看>>
编写Linux中sh文件执行时出现莫名字符的问题
查看>>
数据库自定义函数
查看>>
Object.assign()是浅拷贝
查看>>
简单FTP服务器搭建
查看>>
关于Sublime Text 3搭建Java环境的补充
查看>>
【FFMPEG】Ubuntu上安装FFMPEG
查看>>
【QT开发】信号转发器QSignalMapper的使用
查看>>