博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ1070[SCOI2007]修车
阅读量:5036 次
发布时间:2019-06-12

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

AC通道:

codevs上也有哦:

 

这题感觉还是比较好想的。

因为算的是平均等待时间,那么就要考虑分配问题和顺序问题。

首先我们从s向每个汽车连容量为1,费用为0的边。

然后我们将师傅拆点,拆成n分,可以看做是倒数多少个的状态。

那么我们将每个汽车(i)向每个状态(j,k)都连一条容量为1,费用为k*w[j][i]的边。

表示师傅j在倒数第k个做i产生的贡献值。

然后再将每个状态往t连容量为1,费用为0的边。

跑最小费用最大流就可以了。

 

这题,因为连边多一点,所以zkw稍慢一点点:

#include
#include
#include
using namespace std;const int maxn=65*65;const int INF=0x3f3f3f3f;struct Node{ int data,next,low,cost;}node[maxn*9*2];#define www node[point].low#define now node[point].data#define ccc node[point].cost#define then node[point].nextint n,m,cnt;int s,t,ans;int head[maxn],cur[maxn];int dis[maxn];int a[65][65];bool vis[maxn];void add(int u,int v,int w,int c){ node[cnt].data=v;node[cnt].next=head[u];node[cnt].low=w;node[cnt].cost=c;head[u]=cnt++; node[cnt].data=u;node[cnt].next=head[v];node[cnt].low=0;node[cnt].cost=-c;head[v]=cnt++;}int dfs(int x,int low){ if(x==t) return low; int Low;vis[x]=true; for(int &point=cur[x];point!=-1;point=then) if(www && !vis[now] && dis[x]==dis[now]+ccc){ Low=dfs(now,min(low,www)); if(Low){ www-=Low,node[point^1].low+=Low; return Low; } } return 0;}bool modify(){ int ad=INF; for(int i=s;i<=t;i++) if(vis[i]) for(int point=head[i];point!=-1;point=then) if(www && !vis[now]) ad=min(ad,dis[now]+ccc-dis[i]); if(ad==INF) return false; for(int i=s;i<=t;i++) if(vis[i]) vis[i]=false,dis[i]+=ad; return true;}int main(){#ifndef ONLINE_JUDGE freopen("1070.in","r",stdin); freopen("1070.out","w",stdout);#endif scanf("%d%d",&m,&n); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&a[i][j]); t=n*(m+1)+1; for(int i=s;i<=t;i++) head[i]=-1; for(int i=1;i<=n;i++) add(s,i,1,0); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) for(int k=1;k<=n;k++) add(i,j*n+k,1,k*a[i][j]); for(int i=n+1;i
View Code

spfa似乎快了那么40ms?never mind,反正只是当练习模板了。

#include
#include
#include
#include
using namespace std;const int maxn=65*65;const int INF=0x3f3f3f3f;struct Node{ int data,next,low,cost;}node[maxn*9*2];#define www node[point].low#define now node[point].data#define ccc node[point].cost#define then node[point].nextint n,m,cnt;int s,t,ans;int head[maxn],cur[maxn];int dis[maxn],pre[maxn];int a[65][65];bool inq[maxn];deque
q;void add(int u,int v,int w,int c){ node[cnt].data=v;node[cnt].next=head[u];node[cnt].low=w;node[cnt].cost=c;head[u]=cnt++; node[cnt].data=u;node[cnt].next=head[v];node[cnt].low=0;node[cnt].cost=-c;head[v]=cnt++;}bool SPFA(){ memset(dis,0x3f,sizeof(dis)); int x,Low=INF; q.push_back(s);dis[s]=0;pre[s]=pre[t]=-1; while(!q.empty()){ x=q.front();q.pop_front();inq[x]=false; for(int point=head[x];point!=-1;point=then) if(www && dis[now]>dis[x]+ccc){ dis[now]=dis[x]+ccc;pre[now]=point^1; if(!inq[now]){ if(q.empty() || dis[q.front()]>dis[now]) q.push_front(now); else q.push_back(now); inq[now]=true; } } } if(pre[t]<0) return false; for(int point=pre[t];point!=-1;point=pre[now]) Low=min(Low,node[point^1].low); for(int point=pre[t];point!=-1;point=pre[now]) node[point^1].low-=Low,www+=Low; ans+=dis[t]*Low; return true;}int main(){#ifndef ONLINE_JUDGE freopen("1070.in","r",stdin); freopen("1070.out","w",stdout);#endif scanf("%d%d",&m,&n); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&a[i][j]); t=n*(m+1)+1; for(int i=s;i<=t;i++) head[i]=-1; for(int i=1;i<=n;i++) add(s,i,1,0); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) for(int k=1;k<=n;k++) add(i,j*n+k,1,k*a[i][j]); for(int i=n+1;i
View Code

 

转载于:https://www.cnblogs.com/Robert-Yuan/p/5227709.html

你可能感兴趣的文章
npm常用命令
查看>>
南海区行政审批管理系统接口规范v0.3(规划)4.2.【queryExpireList】当天到期业务查询...
查看>>
[置顶] 细说Cookies
查看>>
[wp7软件]wp7~~新闻资讯,阅读软件下载大全! 集合贴~~~
查看>>
生成指定位数随机数的方法
查看>>
Essential C++学习笔记
查看>>
where,having与 group by连用的区别
查看>>
【MySQL】MySQL锁和隔离级别浅析二 之 INSERT
查看>>
Oracle T4-2 使用ILOM CLI升级Firmware
查看>>
4.14上午
查看>>
数据分析 -- 白话一下什么是决策树模型(转载)
查看>>
Java SPI机制原理和使用场景
查看>>
web前端java script学习2017.7.18
查看>>
删除TXPlatform
查看>>
LaTex:图片排版
查看>>
并发访问超时的问题可能性(引用)
查看>>
中小团队基于Docker的Devops实践
查看>>
利用python打开摄像头并保存
查看>>
System函数的使用说明
查看>>
Selenium-测试对象操作之:获取浏览器滚动条滚动距离
查看>>