BZOJ 4853 [Jsoi2016]飞机调度
2024-09-03 13:41:48
题解:
我严重怀疑语文水平(自己的和出题人的)
把航线按照拓扑关系建立DAG
然后最小路径覆盖
为什么两条首尾相接航线之间不用维护????
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int maxn=;
const int oo=; int n,m;
int w[maxn];
int d[maxn][maxn];//d[x][y]从x到y,w[x]w[y]不算的最短路
int g[maxn][maxn]; int rs[maxn],rt[maxn],rb[maxn]; struct Edge{
int from,to,cap,flow;
};
vector<int>G[maxn];
vector<Edge>edges;
void Addedge(int x,int y,int z){
Edge e;
e.from=x;e.to=y;e.cap=z;e.flow=;
edges.push_back(e);
e.from=y;e.to=x;e.cap=;e.flow=;
edges.push_back(e);
int c=edges.size();
G[x].push_back(c-);
G[y].push_back(c-);
} int s,t;
int vis[maxn];
int dd[maxn];
queue<int>q;
int Bfs(){
memset(vis,,sizeof(vis));
vis[s]=;dd[s]=;q.push(s);
while(!q.empty()){
int x=q.front();q.pop();
for(int i=;i<G[x].size();++i){
Edge e=edges[G[x][i]];
if((e.cap>e.flow)&&(!vis[e.to])){
vis[e.to]=;
dd[e.to]=dd[x]+;
q.push(e.to);
}
}
}
return vis[t];
} int cur[maxn];
int Dfs(int x,int a){
if((x==t)||(a==))return a; int nowflow=,f=;
for(int i=cur[x];i<G[x].size();++i){
cur[x]=i;
Edge e=edges[G[x][i]];
if((dd[x]+==dd[e.to])&&((f=Dfs(e.to,min(a,e.cap-e.flow)))>)){
nowflow+=f;
a-=f;
edges[G[x][i]].flow+=f;
edges[G[x][i]^].flow-=f;
if(a==)break;
}
}
return nowflow;
} int Maxflow(){
int flow=;
while(Bfs()){
memset(cur,,sizeof(cur));
flow+=Dfs(s,oo);
}
return flow;
} int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i)scanf("%d",&w[i]);
for(int i=;i<=n;++i){
for(int j=;j<=n;++j){
scanf("%d",&d[i][j]);
g[i][j]=d[i][j];
}
} for(int k=;k<=n;++k){
for(int i=;i<=n;++i){
for(int j=;j<=n;++j){
if(d[i][k]+w[k]+d[k][j]<d[i][j]){
d[i][j]=d[i][k]+w[k]+d[k][j];
}
}
}
} for(int i=;i<=m;++i){
scanf("%d%d%d",&rs[i],&rt[i],&rb[i]);
} s=m+m+;t=s+;
for(int i=;i<=m;++i)Addedge(s,i,);
for(int i=;i<=m;++i)Addedge(i+m,t,);
for(int i=;i<=m;++i){
for(int j=;j<=m;++j){
if(i==j)continue;
// cout<<i<<' '<<j<<' '<<w[rs[j]]<<' '<<d[rt[i]][rs[j]]+w[rs[j]]<<endl;
if(rb[i]+g[rs[i]][rt[i]]+w[rt[i]]+((rt[i]!=rs[j])?d[rt[i]][rs[j]]+w[rs[j]]:)<=rb[j]){
Addedge(i,m+j,);
}
}
}
cout<<m-Maxflow()<<endl;
return ;
}
最新文章
- cron(CronTrigger)表达式用法
- 背水一战 Windows 10 (35) - 控件(弹出类): FlyoutBase, Flyout, MenuFlyout
- 6.1-CALayer 使用
- java编程思想-java中的并发(二)
- Swing杂记——Swing中引入Android的NinePatch技术,让Swing拥有Android的外观定制能力
- centos环境下使用percona-xtrabackup对mysql5.6数据库innodb和myisam进行快速备份及恢复
- Brn系列商城3.0测试版正式发布,欢迎大家下载测试
- 第二百七十九天 how can I 坚持
- node.js 入门教程(beginnder guide
- drupal7 安装百度编辑器Ueditor及后续使用
- nodejs6下使用koa2
- SHELL 脚本小技巧
- 安装 kubernetes v1.11.1
- luogu2634 聪聪可可 (树形dp)
- Type Call requires API level 11 (current min is 8)解决办法
- day039 数据库索引
- python调用shell脚本
- IOS初级:UIwindow
- Oracle EBS 跳跳转标准销售订单程序转标准销售订单程序
- navicat编辑记录 (zhuan)