【题解】Luogu P2153 [SDOI2009]晨跑
原题传送门
一眼应该就能看出是费用流
因为每个交叉路口只能通过一次,所以我们进行拆点,连一条流量为1费用为0的边
再按照题目给的边(是单向边)建图
跑一下MCMF就行了
拆点很套路的~
#include <bits/stdc++.h>
#define N 205
#define M 20005
#define inf (1<<30)
#define getchar nc
using namespace std;
inline char nc(){
static char buf[100000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline int read()
{
register int x=0,f=1;register char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return x*f;
}
inline void write(register int x)
{
if(!x)putchar('0');if(x<0)x=-x,putchar('-');
static int sta[20];register int tot=0;
while(x)sta[tot++]=x%10,x/=10;
while(tot)putchar(sta[--tot]+48);
}
inline int Min(register int a,register int b)
{
return a<b?a:b;
}
struct node{
int to,next,v,c;
}e[(M<<2)+(N<<1)];
int head[N<<1],cnt=1;
inline void add(register int u,register int v,register int val,register int cost)
{
e[++cnt]=(node){v,head[u],val,cost};
head[u]=cnt;
}
int n,m,s,t,maxflow=0,mincost=0;
int vis[N<<1],dist[N<<1];
inline bool spfa()
{
memset(vis,0,sizeof(vis));
memset(dist,0x3f,sizeof(dist));
dist[s]=0;
vis[s]=1;
queue<int> q;
q.push(s);
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=0;
for(register int i=head[u];i;i=e[i].next)
{
int v=e[i].to;
if(dist[v]>dist[u]+e[i].c&&e[i].v)
{
dist[v]=dist[u]+e[i].c;
if(vis[v]==0)
{
q.push(v);
vis[v]=1;
}
}
}
}
return dist[t]!=0x3f3f3f3f;
}
inline int dfs(register int u,register int flow)
{
if(u==t)
{
vis[t]=1;
maxflow+=flow;
return flow;
}
int used=0;
vis[u]=1;
for(register int i=head[u];i;i=e[i].next)
{
int v=e[i].to;
if((vis[v]==0||v==t)&&e[i].v&&dist[v]==dist[u]+e[i].c)
{
int tmp=dfs(v,Min(e[i].v,flow-used));
if(tmp)
{
mincost+=e[i].c*tmp;
used+=tmp;
e[i].v-=tmp;
e[i^1].v+=tmp;
}
if(used==flow)
return used;
}
}
return used;
}
inline void MCMF()
{
while(spfa())
{
vis[t]=1;
while(vis[t])
{
memset(vis,0,sizeof(vis));
dfs(s,inf);
}
}
}
int main()
{
n=read(),m=read();
s=1,t=n;
for(register int i=2;i<n;++i)
add(i,i+n,1,0),add(i+n,i,0,0);
for(register int i=1;i<=m;++i)
{
int u=read(),v=read(),cost=read();
if(u==1)
add(u,v,1,cost),add(v,u,0,-cost);
else if(v==n)
add(u+n,v,1,cost),add(v,u+n,0,-cost);
else
add(u+n,v,1,cost),add(v,u+n,0,-cost);
}
MCMF();
write(maxflow),putchar(' '),write(mincost);
return 0;
}
【题解】Luogu P2153 [SDOI2009]晨跑的更多相关文章
- P2153 [SDOI2009]晨跑(最小费用最大流)
题目描述 Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他坚持下来的只有晨跑. 现在给出一张学校附近的地图,这张地图中包含N个十字路口和M条街 ...
- 洛谷 P2153 [SDOI2009]晨跑
题目描述 Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他坚持下来的只有晨跑. 现在给出一张学校附近的地图,这张地图中包含N个十字路口和M条街 ...
- P2153 [SDOI2009]晨跑
思路 典型的最小费用最大流问题,拆点,每个点对应的入点和出点之间连一条cap=1的边表示只能经过一次的限制条件 然后其他边从u的出点连向v的入点即可 代码 #include <cstdio> ...
- 洛谷$P2153\ [SDOI2009]$ 晨跑 网络流
正解:网络流 解题报告: 传送门$QwQ$ 题目好长昂,,,大概概括下$QwQ$.就说有$n$个节点$m$条边,然后要求每次走的路径都不一样,问最多能走多少次,然后在次数最多的前提下问路径最短是多少$ ...
- BZOJ 1877: [SDOI2009]晨跑 费用流
1877: [SDOI2009]晨跑 Description Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他坚持下来的只有晨跑. 现在给出一 ...
- BZOJ 3438 小M的作物 & BZOJ 1877 [SDOI2009]晨跑
我由衷地为我的朋友高兴.哈哈,yian,当你nick name破百上千时,再打“蒟蒻”就会被打的. 好的,说正事吧.请注意,这还是题解.但我发现,网络流实在是太套路了(怪不得这两年几乎销声匿迹).我们 ...
- 【BZOJ1877】[SDOI2009]晨跑 最小费用最大流
[BZOJ1877][SDOI2009]晨跑 Description Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他坚持下来的只有晨跑. 现 ...
- 1877: [SDOI2009]晨跑
1877: [SDOI2009]晨跑 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 2007 Solved: 1085[Submit][Status][ ...
- bzoj1877: [SDOI2009]晨跑
挺裸的最小费用最大流... #include<cstdio> #include<queue> #include<cstring> #include<iostr ...
随机推荐
- Oracle同义词(synonym)
oracle的同义词总结 从字面上理解就是别名的意思,和视图的功能类似.就是一种映射关系. 同义词拥有如下好处: 节省大量的数据库空间,对不同用户的操作同一张表没有多少差别; 扩展的数 ...
- J - Printer Queue 优先队列与队列
来源poj3125 The only printer in the computer science students' union is experiencing an extremely heav ...
- git纯净提交代码(只提交自己改过的文件)
添加远程仓库,这个远程仓库是要进行发起合并请求的仓库,简单来说就是项目的主要代码库,不是自己派生的代码库 git remote add main http://xxx 从远端仓库下载新分支与数据gi ...
- filter的知识点 和 实例
一.过滤器Filter 1.filter的简介 filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行,并且可以对目 标资源访问前后进行逻辑处理 2.快速入门 步骤: 1)编写一个 ...
- 9、socket.io,websocket 前后端实时通信,(聊天室的实现)
websocket 一种通信协议 ajax/jsonp 单工通信 websocket 全双工通信 性能高 速度快 2种方式: 1.前端的websocket 2.后端的 socket.io 一.后端so ...
- java获取当前网站的IP地址
package ip; import java.net.InetAddress; import java.net.UnknownHostException; /** * * @author * */ ...
- Listen error 错误和 limit of inotify watches was reached
今天在生产环境中报错rails c中报了一个错误: FATAL: Listen error: unable to monitor directories for changes. Visit http ...
- Gym 101775B - Scapegoat - [贪心+优先队列]
题目链接:http://codeforces.com/gym/101775/problem/B Aori is very careless so she is always making troubl ...
- Codeforces 1068 - A/B/C/D/E - (Done)
链接:http://codeforces.com/contest/1068 A - Birthday - [计算题] 题意:一共 $N$ 种硬币,我已经有其中 $K$ 种,我的 $M$ 个朋友每人送我 ...
- 项目实战:负载均衡集群企业级应用实战—LVS详解
目录 一.负载均衡集群介绍 二.lvs 的介绍 三.LVS负载均衡四种工作模式 1.NAT工作模式 2.DR工作模式 3.TUN工作模式 4.full-nat 工作模式 5.四者的区别 四.LVS i ...