【2015-2016 ACM-ICPC Pacific Northwest Regional Contest (Div 1)A】【floyd 最小路径覆盖】最少飞机数满足所有航班要求
2015-12-03 19:48
579 查看
#include<stdio.h> #include<iostream> #include<string.h> #include<string> #include<ctype.h> #include<math.h> #include<set> #include<map> #include<vector> #include<queue> #include<bitset> #include<algorithm> #include<time.h> using namespace std; void fre(){freopen("c://test//input.in","r",stdin);freopen("c://test//output.out","w",stdout);} #define MS(x,y) memset(x,y,sizeof(x)) #define MC(x,y) memcpy(x,y,sizeof(x)) #define MP(x,y) make_pair(x,y) #define ls o<<1 #define rs o<<1|1 typedef long long LL; typedef unsigned long long UL; typedef unsigned int UI; template <class T1,class T2>inline void gmax(T1 &a,T2 b){if(b>a)a=b;} template <class T1,class T2>inline void gmin(T1 &a,T2 b){if(b<a)a=b;} const int N=500+5,M=0,Z=1e9+7,ms63=1061109567; int n,m; int p ; int t ,f ; pair<int,int>a ,b ; int match ; bool vis ; vector<int>w ; void floyd() { MC(f,t); for(int k=1;k<=n;++k) { for(int i=1;i<=n;++i) { for(int j=1;j<=n;++j) { gmin(f[i][j],f[i][k]+f[k][j]); } } } } int find(int x) { vis[x]=1; for(int i=w[x].size()-1;~i;--i) { int y=w[x][i]; if(match[y]==-1) { match[y]=x; return 1; } } for(int i=w[x].size()-1;~i;--i) { int y=w[x][i]; if(!vis[match[y]]&&find(match[y])) { match[y]=x; return 1; } } return 0; } int main() { while(~scanf("%d%d",&n,&m)) { for(int i=1;i<=n;++i)scanf("%d",&p[i]); for(int i=1;i<=n;++i) { for(int j=1;j<=n;++j) { scanf("%d",&t[i][j]); if(i!=j)t[i][j]+=p[j]; } } floyd(); for(int i=1;i<=m;++i) { int x,y,z; scanf("%d%d%d",&x,&y,&z); a[i]=MP(x,z); b[i]=MP(y,z+t[x][y]); } for(int i=1;i<=m;++i) { w[i].clear(); for(int j=1;j<=m;++j)if(i!=j&&b[i].second+f[b[i].first][a[j].first]<=a[j].second)w[i].push_back(j); } int ans=0; MS(match,-1); for(int i=1;i<=m;++i) { MS(vis,0); if(find(i))++ans; } printf("%d\n",m-ans); } return 0; } /* 【trick&&吐槽】 1,连边的基准是状态,而不是按照机场。 2,匹配的时候一定要防止自己连自己。 3,不同机场之间,能否达到是要用floyd之后的时间。 【题意】 有n(1<=n<=500)个机场。 每两个机场之间有一个抵达时间,i->j的时间被我们记录在a[i][j]中。 同时,如果飞机还要再飞,那到达的机场i还要对飞机做检修,花费时间为p[i]; 记下来还有m(1<=m<=500)条航线, 对于第i条航线,有si,fi,ti,表示我们从需要有一架飞机,恰好于时刻ti出发,si直飞到fi。 问你这个公司至少要提供多少架飞机。 【类型】 floyd 最小路径覆盖 【分析】 这道题,我们有m条航线。{si,fi,ti}表示于时刻ti出发,从si到fi的一条航线。可以被标记为一个点。 显然,我们最多只会需要m架飞机。 每个点被自然分配成了2个点,起点和终点,都附带一个事件属性。 如果A的终点和B的起点,可以在时间内相通,那么我们就可以减少一架飞机。 于是,只要floyd后最小路径覆盖就可以解决这道题。 问题来了—— 1,floyd可以求出从x到y的时间,因为我们还要保留直达时间,所以,floyd矩阵需要额外算。 我们要把所有抵达点的维修时间算上,这样它才可以继续起飞。 2,最小路径覆盖,我们需要确定什么样的两个点之间可以连边。 什么样的两个点之间可以连边呢?点A的终点时间+(A到B的时间)<=点B的起点时间的时候。 这道题就这样做完啦。 【时间复杂度&&优化】 O(n^3) */
相关文章推荐
- 【Educational Codeforces Round 1A】【水题】Tricky Sum 1~n之和减去2的幂
- 【Educational Codeforces Round 1B】【字符串平移 水题】Queries on a String 字符串平移水题
- 【Educational Codeforces Round 1C】【计算几何-极角排序 atan2 long double】Nearest vectors 平面图上原点引出角度最小的两个
- 【Educational Codeforces Round 1D】【DFS 联通块打标记法】Igor In the Museum 联通块内墙的面数
- 【Educational Codeforces Round 1E】【动态规划-多维DP】Chocolate Bar 矩形巧克力掰开吃的最小成本
- 【Codeforces Round 299 (Div 2)D】【KMP 本质是最前与最后匹配】Tavas and Malekas 长度为n的匹配串被模板串多位点覆盖的匹配串个数
- 【Codeforces Round 333 (Div 2)A 】【水题 简单进制模拟】Two Bases 不同进制数比大小
- 【Codeforces Round 333 (Div 2)B】【贪心 多指针】Approximating a Constant Range 给定数组 相邻元素波动为1 求差值不超1的最长序连续子序列
- 【Codeforces Round 333 (Div 2)C】【最短路】The Two Routes 完全图两种双向边的最小最大距离
- 【Codeforces Round 333 (Div 2)D】【线段树 or ST-RMQ 初始化78msAC】Lipshitz Sequence 若干区间询问所有子区间的答案和
- 【Codeforces Round 333 (Div 2)E】【期望DP概率做法 树状数组转前缀和】Kleofáš and the n-thlon n场比赛m个人获得总名次的期望
- 【Codeforces Testing Round 12A】【讨论 边界元素映射】Divisibility 区间范围内k倍数的数的个数
- 【Codeforces Testing Round 12B】【贪心】Restaurant 选取数量最多的不覆盖区间数
- 【Codeforces Testing Round 12C】【DP 树状数组优化】Subsequences n个不同数,长度为m的LIS数
- 【Educational Codeforces Round 2B】【map or 二分查找】Queries about less or equal elements b[]中的每个数比a[]中多少数大
- 【Educational Codeforces Round 2C】【贪心】最少修改数下得到字典序尽可能小回文串
- 【Educational Codeforces Round 2D】【计算几何 圆面积交 模板】Area of Two Circles' Intersection
- 【Educational Codeforces Round 2E】【STL-map 启发式合并 or 线段树动态开节点 】Lomsat gelral 一棵树每点一个颜色问每个节点子树的颜色众数之和
- 【Codeforces Beta Round 2A】【模拟 map 有map的java实现哦】Winner 第一个达到最终最高分的人名
- 【HDU6195 2017 ACM ICPC Asia Regional Shenyang Online B】【水题 匹配】cable cable cable M个格子任选K个放K个物品的最小连边匹配