当前位置: 首页 > news >正文

POJ3216 最小路径覆盖

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

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

   好了上代码

  1 #include<cstdio>            
  2 #include<cstring>
  3 #include<iostream>
  4 #include<vector>
  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<int> 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<c;d++)
 36         {
 37             if(rela[d].pos==rela[c].pos) p++;
 38         }
 39         rela[c].realpos=rela[c].pos+n*p;
 40         point[rela[c].realpos]=1;
 41         if(sum<rela[c].realpos) sum=rela[c].realpos;
 42     }
 43 }
 44 void floyd()
 45 {
 46     for(int i=1;i<=n;i++)
 47     {
 48         for(int j=1;j<=n;j++)
 49         {
 50            for(int k=1;k<=n;k++)
 51            {
 52                mize[j][k]=mize[j][k]<mize[i][k]+mize[j][i]?mize[j][k]:mize[i][k]+mize[j][i];
 53            }
 54         }
 55     }
 56 
 57 
 58 }
 59 void set_map()
 60 {
 61     for(int i=1;i<=m;i++)
 62     {
 63         int realpos=rela[i].realpos,pos=rela[i].pos,time=rela[i].need+rela[i].start;
 64         for(int j=1;j<=m;j++)
 65         {
 66             if(j==i) continue;
 67             int a=rela[j].realpos,b=rela[j].pos,t=rela[j].start;
 68      //       if(mize[pos][b]==-1||mize[b][pos]==-1) continue;
 69             if(time+mize[pos][b]<=t)     // 矩阵式对称的  怎么写都无所谓
 70             {
 71                 q[realpos].push_back(a);
 72            //     q[a].push_back(realpos);
 73             }
 74         }
 75     }
 76  /*   for(int i=1;i<=8;i++)
 77     {
 78         if(q[i].size()==0) continue;
 79         cout<<i<<": "<<endl;
 80         for(int j=0;j<q[i].size();j++)
 81         {
 82             cout<<q[i][j]<<" ";
 83         }
 84         cout<<endl;
 85     }*/
 86 }
 87 int dfs(int x)
 88 {
 89     for(int i=0;i<q[x].size();i++)
 90     {
 91           int y=q[x][i];
 92           if(!vis[y])
 93           {
 94               vis[y] = true;
 95              if(link[y]== -1||dfs(link[y]))
 96              {
 97                   link[y] = x;
 98                   return true;
 99              }
100           }
101     }
102     return false;
103 }
104 void solve()
105 {
106     int s=0;
107     memset(link,-1,sizeof(link));
108     for(int i=1;i<=sum;i++)
109     {
110         if(point[i]==0) continue;
111         memset(vis,0,sizeof(vis));
112         if(dfs(i)) s++;
113     }
114     printf("%d\n",m-s);
115 }
116 int main()
117 {
118     while(scanf("%d%d",&n,&m)!=EOF)
119     {
120         if(n==0&&m==0) break;
121         sum=0;
122         init();
123         floyd();
124         set_map();
125         solve();
126     }
127     return 0;
128 }
View Code

 

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

相关文章:

  • 一个字让你从新手成为合格的程序员
  • 学习ASP.NET缓存机制
  • 理解分析问题的常用方法
  • BZOJ 1010: [HNOI2008]玩具装箱toy(dp+斜率优化)
  • 解决问题的方法
  • html5开发之viewport使用
  • 迅雷下载百度云文件
  • Linux 命令的一些记录(五):在安装ubuntu的一些操作
  • Windows下GitHub安装(简易版)
  • MeeGo handset 1.1开发环境[2]:安装MeeGo 1.1 SDK
  • c 有关N!阶乘的相关问题----陆续补充上来
  • JSP
  • 土法合并GridView表头
  • 现代编译原理--第零章(含代码)
  • X86保护模式编程总结(1)
  • 3.7、@ResponseBody 和 @RestController
  • Apache Pulsar 2.1 重磅发布
  • css的样式优先级
  • export和import的用法总结
  • Intervention/image 图片处理扩展包的安装和使用
  • javascript 总结(常用工具类的封装)
  • markdown编辑器简评
  • MaxCompute访问TableStore(OTS) 数据
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • nodejs调试方法
  • Python十分钟制作属于你自己的个性logo
  • Quartz初级教程
  • Rancher-k8s加速安装文档
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • Vue2 SSR 的优化之旅
  • Zsh 开发指南(第十四篇 文件读写)
  • ------- 计算机网络基础
  • 记一次用 NodeJs 实现模拟登录的思路
  • 前端临床手札——文件上传
  • 前嗅ForeSpider采集配置界面介绍
  • 项目实战-Api的解决方案
  • 阿里云ACE认证之理解CDN技术
  • 选择阿里云数据库HBase版十大理由
  • ​ubuntu下安装kvm虚拟机
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • (06)金属布线——为半导体注入生命的连接
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (12)Hive调优——count distinct去重优化
  • (31)对象的克隆
  • (C语言)逆序输出字符串
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (第27天)Oracle 数据泵转换分区表
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (十)T检验-第一部分
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (一)80c52学习之旅-起始篇
  • (转)mysql使用Navicat 导出和导入数据库