ACdream 1017 Fast Transportation

http://acdream.info/problem?pid=1017

题意:给n个点,m条边,K个货物,要从从S到T,每天每条边最多只能经过1次,求要几天能运完

思路:拆成分层图,每层向下一层连边,注意i也能连到i,流量为inf,代表这个点的货车这天没动

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<cstring>
 6 #define inf 0x7fffffff
 7 struct edge{
 8     int u,v;
 9 }e[200005];
10 int tot,go[500005],next[500005],first[500005],op[500005],flow[500005],dis[500005],cnt[500005];
11 int T,S,ss,tt,n,m,nodes,K;
12 int id[105][105];
13 int read(){
14     int t=0,f=1;char ch=getchar();
15     while (ch<‘0‘||ch>‘9‘){if (ch==‘-‘) f=-1;ch=getchar();}
16     while (‘0‘<=ch&&ch<=‘9‘){t=t*10+ch-‘0‘;ch=getchar();}
17     return t*f;
18 }
19 void insert(int x,int y,int z){
20     tot++;
21     go[tot]=y;
22     next[tot]=first[x];
23     first[x]=tot;
24     flow[tot]=z;
25 }
26 void add(int x,int y,int z){
27     insert(x,y,z);op[tot]=tot+1;
28     insert(y,x,0);op[tot]=tot-1;
29 }
30 int dfs(int x,int f){
31     if (x==T) return f;
32     int mn=nodes,sum=0;
33     for (int i=first[x];i;i=next[i]){
34          int pur=go[i];
35          if (flow[i]&&dis[pur]+1==dis[x]){
36              int save=dfs(pur,std::min(flow[i],f-sum));
37              flow[i]-=save;
38              flow[op[i]]+=save;
39              sum+=save;
40              if (dis[S]>=nodes||f==sum) return sum;
41          }
42          if (flow[i]) mn=std::min(mn,dis[pur]);
43     }
44     if (sum==0){
45         cnt[dis[x]]--;
46         if (cnt[dis[x]]==0){
47            dis[S]=nodes;
48         }else{
49            dis[x]=mn+1;
50            cnt[dis[x]]++;
51         }
52     }
53     return sum;
54 }
55 bool check(int mid){
56     for (int i=0;i<=nodes;i++) first[i]=cnt[i]=dis[i]=0;tot=0;
57     int sz=0;
58     for (int i=1;i<=mid;i++)
59         for (int j=1;j<=n;j++)
60             id[i][j]=++sz;
61     T=sz+1;
62     sz+=2;
63     S=0;nodes=sz;
64     add(S,id[1][ss],K);
65     for (int i=1;i<=mid;i++)
66         add(id[i][tt],T,K);
67     for (int i=1;i<mid;i++)
68      for (int j=1;j<=n;j++)
69       add(id[i][j],id[i+1][j],inf);
70     for (int i=1;i<=m;i++)
71         for (int j=1;j<mid;j++)
72             add(id[j][e[i].u],id[j+1][e[i].v],1),add(id[j][e[i].v],id[j+1][e[i].u],1);
73     int Ans=0;
74     while (dis[S]<nodes) Ans+=dfs(S,inf);
75     return Ans==K;
76 }
77 int main(){
78     while (scanf("%d",&n)!=EOF){
79          m=read();K=read();ss=read();tt=read();
80          for (int i=1;i<=m;i++)
81             e[i].u=read(),e[i].v=read();
82          int l=1,r=n+K+2,ans=0;
83          while (l<=r){
84             int mid=(l+r)/2;
85             if (check(mid)) r=mid-1,ans=mid;
86                 else l=mid+1;
87           }
88           printf("%d\n",ans-1);
89     }
90 }
时间: 2024-12-24 06:57:14

ACdream 1017 Fast Transportation的相关文章

HDU 4965 Fast Matrix Calculation 【矩阵】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4965 题目大意:给你一个N*K的矩阵A以及一个K*N的矩阵B (4 <= N <= 1000)以及 (2 <=K <= 6),然后接下来四步: 算一个新的矩阵C=A*B 算M=C^ (N*N) 对于M中的每个元素%6 将M中每个元素加起来,算出和. 也就是求出A*B * A*B * A*B * A*B * A*B *--* A*B   但是A*B形成的矩阵是N*N,而N大小有可能是10

ACdream 1420 High Speed Trains【Java大数高精度 + 递推】

High Speed Trains Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) 链接:http://acdream.info/problem?pid=1420 Problem Description The kingdom of Flatland has n cities. Recently the king of Flatland visited Japan and was a

hdu 4940 Destroy Transportation system(水过)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4940 Destroy Transportation system Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 21    Accepted Submission(s): 17 Problem Description Tom is a

Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast

1.事件描述:CentOS7下使用tree命令,发现该命令没有被安装,在安装的过程中发现yum报错 [[email protected] ~]# tree -d bash: tree: 未找到命令... [[email protected] ~]# yum -y install tree 已加载插件:fastestmirror, langpacks Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast

UVA 11992(Fast Matrix Operations-线段树区间加&amp;改)[Template:SegmentTree]

Fast Matrix Operations There is a matrix containing at most 106 elements divided into r rows and c columns. Each element has a location (x,y) where 1<=x<=r,1<=y<=c. Initially, all the elements are zero. You need to handle four kinds of operati

CodeVS 1017 乘积最大

1017 乘积最大 2000年NOIP全国联赛普及组NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得以参加.活动中,主持人给所有参加活动的选手出了这样一道题目: 设有一个长度为N的数字串,要求选手使用K个乘号将它分成K

Fast Paxos(转)

自从Lamport在1998年发表Paxos算法后,对Paxos的各种改进工作就从未停止,其中动作最大的莫过于2005年发表的Fast Paxos.无论何种改进,其重点依然是在消息延迟与性能.吞吐量之间作出各种权衡.为了容易地从概念上区分二者,称前者Classic Paxos,改进后的后者为Fast Paxos. 1. Fast Paxos概览 Lamport在40多页的论文中不仅提出了Fast Paxos算法,并且还从工程实践的角度重新描述了Paxos,使其更贴近应用场景.从一般的Client

HUST 1017 - Exact cover (Dancing Links 模板题)

1017 - Exact cover 时间限制:15秒 内存限制:128兆 自定评测 5584 次提交 2975 次通过 题目描述 There is an N*M matrix with only 0s and 1s, (1 <= N,M <= 1000). An exact cover is a selection of rows such that every column has a 1 in exactly one of the selected rows. Try to find o

Fast检测角点算法

1.角点定义 角点是一种局部特征,具有旋转不变性和不随光照条件变化而变化的特点,一般将图像中曲率足够高或者曲率变化明显的点作为角点.检测得到的角点特征通常用于图像匹配.目标跟踪.运动估计等方面. 2.Fast检测角点 1)基本思想 E.Rosten和T.Drummond两位大佬在06年一篇文章中提出了FAST特征算法,基本思想十分简单:以某个像素点为圆心,某半径的圆周上其他像素点与圆心像素点特性差异达到某种标准时即认为该点就是角点. 2)数学模型 经过测试发现,选取的圆形半径为3时可以兼顾检测结