[CTSC1999]家园
时间:2020-01-18
本文章向大家介绍 [CTSC1999]家园,主要包括 [CTSC1999]家园使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题意简化
给定几趟循环移动的载客列车与站点数量,求所有人从第1站到最后一站的时间
题目链接
题解
这个题一开始确实比较难想,因为这题数据规模奇小,我们可以直接根据每一单位时间建图。
也就是说,第一步先建立虚拟原点汇点之后,将地球和月亮与其连边,然后每一天的每一趟车所在点向它下一天的所在点连一条容量为载客量的边,然后要把每一天的每个点向下一天连一条容量为inf的边(因为可以等嘛)
然后就是裸的最大流了,dinic,EK都行
代码
#include<bits/stdc++.h>
using namespace std;
#define re register
#define in inline
#define ll long long
#define get getchar()
in int read()
{
int t=0,x=1; char ch=get;
while((ch<'0' || ch>'9') && ch!='-') ch=get;
if(ch=='-') ch=get,x=-1;
while(ch<='9' && ch>='0') t=t*10+ch-'0',ch=get;
return t*x;
}
const int inf=0x3f3f3f3f;
const int _=60001;
const int MAXN=55;
struct edge{
int to,ne,w;
}e[_<<2];
int tot=-1,S=50000,T=50001,head[_],h[MAXN],cyc[MAXN][MAXN],r[MAXN],n,m,k,dep[_],vis[_];
in void add(int x,int y,int z)
{
e[++tot].ne=head[x],e[tot].to=y,e[tot].w=z,head[x]=tot;
e[++tot].ne=head[y],e[tot].to=x,e[tot].w=0,head[y]=tot;
}
in bool bfs()
{
memset(dep,0x3f,sizeof(dep));
memset(vis,0,sizeof(vis));
queue<int >q;
q.push(S);
dep[S]=0;
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=0;
for(re int i=head[u];i!=-1;i=e[i].ne)
{
int v=e[i].to;
if(e[i].w && dep[v]>dep[u]+1)
{
dep[v]=dep[u]+1;
if(!vis[v]) {
vis[v]=1;
q.push(v);
}
}
}
}
return dep[T]!=0x3f3f3f3f;
}
in int dfs(int u,int flow)
{
int rlow=0;
if(u==T)
return flow;
int used=0;
for(re int i=head[u];i!=-1;i=e[i].ne)
{
int v=e[i].to;
if(e[i].w&&dep[v]==dep[u]+1) {
if(rlow=dfs(v,min(flow-used,e[i].w)))
{
used+=rlow;
e[i].w-=rlow;
e[i^1].w+=rlow;
if(rlow==flow) break;
}
}
}
return used;
}
in int dinic()
{
int ans=0;
while(bfs())
ans+=dfs(S,inf);
return ans;
}
int main()
{
memset(head,-1,sizeof(head));
n=read(),m=read(),k=read();
n+=2;
for(re int i=1;i<=m;i++) {
h[i]=read();
r[i]=read();
for(re int j=0;j<r[i];j++) {
cyc[i][j]=read()+2;
}
}
int Time=0,sum=0;
while(Time<=500)
{
add(S,Time*n+2,inf);
add(Time*n+1,T,inf);
if(Time!=0){
for(re int i=1;i<=m;i++)
{
int x=cyc[i][(Time-1)%r[i]],y=cyc[i][((Time)%r[i])];
add(x+(Time-1)*n,y+(Time)*n,h[i]);
}
for(re int i=1;i<=n;i++) add(i+(Time-1)*n,i+(Time)*n,inf);
}
sum+=dinic();
if(sum>=k) {cout<<Time<<endl;return 0;}
Time++;
}
printf("0\n");
return 0;
}
原文地址:https://www.cnblogs.com/yzhx/p/12209667.html
- 我的WCF之旅(4):WCF中的序列化[下篇]
- [WCF权限控制]模拟(Impersonation)与委托(Delegation)[上篇]
- Android EclipseIDE技巧
- 什么是编译错误,运行时错误及逻辑错误?
- 我的WCF之旅(4):WCF中的序列化[上篇]
- WCF技术剖析之二十八:自己动手获取元数据[附源代码下载]
- 微信年度重磅“小游戏”上线,罗胖一度退出的小程序正在逆袭
- 谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持
- Android注解学习(1)
- [WCF权限控制]ASP.NET Roles授权[上篇]
- [WCF权限控制]ASP.NET Roles授权[下篇]
- 如何解决分布式系统中的跨时区问题[实例篇]
- Visual Studio对程序集签名时一个很不好用的地方
- 一个关于解决序列化问题的编程技巧
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法