ACdream 1017 [分层图][网络流]
/*
大连热身C题 不要低头,不要放弃,不要气馁,不要慌张
题意:
给一个城市路线图,给定起点给定终点。有n个货物从起点运送到终点。城市的边是无向边。
每个货物每天如果通过某条路,那么这天这条路只能运送这一个货物,另外一个方向也不得运送货物。
问最少需要多少天,使得起点的货物全部运送到终点。 思路:
按照天数将城市节点裂点。即第i天的某个节点。
枚举天数,不断重新构建网络,跑最大流。找到最小的天数使得最大流大于等于n。
看了大神的博客,知道这个东西实际上叫做分层图。 */ #include<bits/stdc++.h>
using namespace std;
const int MAXN=,MAXM=,inf=1e9;
struct Edge
{
int v,c,f,nx;
Edge() {}
Edge(int v,int c,int f,int nx):v(v),c(c),f(f),nx(nx) {}
} E[MAXM];
int G[MAXN],cur[MAXN],pre[MAXN],dis[MAXN],gap[MAXN],sz;
void init()
{
sz=; memset(G,-,sizeof(G));
}
void add_edge(int u,int v,int c)
{
//printf("%d %d \n",u,v);
E[sz]=Edge(v,c,,G[u]); G[u]=sz++;
E[sz]=Edge(u,,,G[v]); G[v]=sz++;
}
bool bfs(int S,int T)
{
static int Q[MAXN]; memset(dis,-,sizeof(dis));
dis[S]=; Q[]=S;
for (int h=,t=,u,v,it;h<t;++h)
{
for (u=Q[h],it=G[u];~it;it=E[it].nx)
{
if (dis[v=E[it].v]==-&&E[it].c>E[it].f)
{
dis[v]=dis[u]+; Q[t++]=v;
}
}
}
return dis[T]!=-;
}
int dfs(int u,int T,int low)
{
if (u==T) return low;
int ret=,tmp,v;
for (int &it=cur[u];~it&&ret<low;it=E[it].nx)
{
if (dis[v=E[it].v]==dis[u]+&&E[it].c>E[it].f)
{
if (tmp=dfs(v,T,min(low-ret,E[it].c-E[it].f)))
{
ret+=tmp; E[it].f+=tmp; E[it^].f-=tmp;
}
}
}
if (!ret) dis[u]=-; return ret;
}
int dinic(int S,int T)
{
int maxflow=,tmp;
while (bfs(S,T))
{
memcpy(cur,G,sizeof(G));
while (tmp=dfs(S,T,inf)) maxflow+=tmp;
}
return maxflow;
}
struct edge{
int id;
edge *next;
};
edge edges[];
edge *adj[];
int ednum;
inline void addedge(int a,int b){
edge *tmp=&edges[ednum++];
tmp->id=b;
tmp->next=adj[a];
adj[a]=tmp;
}
int x[],y[];
int ddis[];
struct st{
st(){}
st(int a,int b){
id=a;step=b;
}
int id,step;
};
int main()
{
int n,m,k,s,t;
while(scanf("%d%d%d%d%d",&n,&m,&k,&s,&t)!=EOF){
if(m>=)while()puts("+++");
ednum=;
memset(adj,NULL,sizeof(adj));
for(int i=;i<=m;i++){
scanf("%d%d",x+i,y+i);
addedge(x[i],y[i]);
addedge(y[i],x[i]);
}
memset(ddis,-,sizeof(ddis));
for(int i=;;i++){
init();
for(int j=;j<=m;j++){
for(int tt=;tt<i;tt++){
add_edge(tt*n+x[j],tt*n+n+y[j],);
add_edge(tt*n+y[j],tt*n+n+x[j],);
}
}
add_edge(,,k);
for(int j=;j<=i;j++){
add_edge(j*n+t,,inf);
add_edge(,j*n+s,inf);
}
int w=dinic(,);
if(w>=k){
printf("%d\n",i);
break;
}
}
}
}
ACdream 1017 [分层图][网络流]的更多相关文章
- [CTSC1999]家园 分层图网络流_并查集
		
Code: #include<cstdio> #include<vector> #include<algorithm> #include<queue> ...
 - POJ 1895 分层图网络流+输出路径
		
题意: 题目描述:在公元3141年人类的足迹已经遍布银河系.为了穿越那巨大的距离,人类发明了一种名为超时空轨道的技术.超时空轨道是双向的,连接两个星系,穿越轨道需要一天的时间.然而这个轨道只能同时给一 ...
 - 【网络流24题】 No.15 汽车加油行驶问题 (分层图最短路i)
		
[题意] 问题描述:给定一个 N*N 的方形网格,设其左上角为起点◎, 坐标为( 1, 1), X 轴向右为正, Y轴向下为正, 每个方格边长为 1, 如图所示. 一辆汽车从起点◎出发驶向右下角终点▲ ...
 - 【网络流24题】 No.14 孤岛营救问题 (分层图最短路)
		
[题意] 1944 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛, 营救被敌军俘虏的大兵瑞恩. 瑞恩被关押在一个迷宫里, 迷宫地形复杂, 但幸好麦克得到了迷宫的地形图. 迷宫的外形是 ...
 - ACdream 1017 Fast Transportation
		
http://acdream.info/problem?pid=1017 题意:给n个点,m条边,K个货物,要从从S到T,每天每条边最多只能经过1次,求要几天能运完 思路:拆成分层图,每层向下一层连边 ...
 - [CODEVS1911] 孤岛营救问题(分层图最短路)
		
传送门 吐槽:神tm网络流... 用持有的钥匙分层,状态压缩,用 2 进制表示持有的钥匙集合. dis[i][j][k] 表示持有的钥匙集合为 k,到达点 (i, j) 的最短路径. 分层图的最短路听 ...
 - 【题解】P3645 [APIO2015]雅加达的摩天楼(分层图最短路)
		
[题解]P3645 [APIO2015]雅加达的摩天楼(分层图最短路) 感觉分层图是个很灵活的东西 直接连边的话,边数是\(O(n^2)\)的过不去 然而我们有一个优化的办法,可以建一个新图\(G=( ...
 - 【BZOJ-3627】路径规划      分层图 + Dijkstra + spfa
		
3627: [JLOI2014]路径规划 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 186 Solved: 70[Submit][Status] ...
 - poj3635Full Tank?[分层图最短路]
		
Full Tank? Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7248 Accepted: 2338 Descri ...
 
随机推荐
- CLR via C# 3rd - 01 - The CLR's Execution Model
			
1. Assemly A managed module is a standard 32-bit Microsoft Windoes portable executable (PE32) ...
 - Struts2学习笔记
			
一.struts2的工作原理 上图为struts整体结构. 1.客户端初始化一个指向servlet的请求: 2.请求通过一系列过滤器(其中的ActionContextCleanUp为可选过滤器,对st ...
 - 接触到得到新语言里面涉及到很多关于ECMscript相关知识,所以还是来总结一下吧
			
ES6新增加了一些特性下面我就一边回忆一边写博文吧. 1.es6里面给我印象最深的应该就是箭头操作符(=>),它简化了函数的书写,第一次看见的时候完全懵逼,然后百度后才知道.操作符左边为输入的参 ...
 - 怎么使用jquery阻止页面的离开或卸载
			
//绑定beforeunload事件$(window).bind('beforeunload',function(){return '您输入的内容尚未保存,确定离开此页面吗?';});//解除绑定,一 ...
 - split,slice,splice,replace的用法
			
split()方法用于把一个字符串分割成字符串数组 str.split("字符串/正则表达式从该参数制定额地方分割str",可选,可指定返回数组的最大长度,如果没设置参数,整个字符 ...
 - 带日期的bean转为json(bean->JSON)
			
示例代码: JsonBean bean = new JsonBean();bean.setName("NewBaby");bean.setAge(1);bean.setBorn(n ...
 - opendir函数
			
#include<sys/types.h> #include<dirent.h> DIR *dirptr = NULL; struct dirent *entry; dirpt ...
 - Java操作redis简单示例
			
第一:安装Redis 首先我们要安装Redis,就像我们操作数据库一样,在操作之前肯定要先创建好数据库的环境. Redis的下载可以百度一下,或者打开下面的下载链接: https:/ ...
 - 汇编语言基础 debug的使用
			
-r 查看,改变CPU寄存器的内容 -r 加上寄存器名 在:后输入要写入的数据后 完成更改 debug 随着CS IP的改变 对应的汇编指令也不同 -r ip -r cs修改 ip cs 的值 d 段 ...
 - Fiddler (HTTP抓包)简介
			
1.什么是Fiddler? Fiddler是位于客户端和服务器端的HTTP代理,也是目前最常用的http抓包工具之一.它能够记录客户端和服务器之间的所有HTTP请求,可以针对特定的HTTP请求,分析请 ...