[补档]2017-7-29 大佬讲课笔记
网络流
基本定义
可行流
- 源点s的总流出量等于汇点t的总流入量
- 其它点的总流入量等于总流出量
- 每条边的流量不超过容量上限
增广路
基本概念
假设有这样一条路径,从源点s一直到汇点t每条边的已用流量都小于容量,那我们便能找到在这条路径上能够增加的流量的最大值 val = min{c(u,v)-f(u,v)}。加上这个值后,这个流依然是可行流,而这条路径就是增广路。
思路
依据
增广路定理:假如当前残余网络中仍能找到一条增广路,那么当前的可行流仍可以增大,不是最大流。反之,如果到了“无路可增”的地步,当前流就是最大流。
实现过程
- 为什么要加反向边?
首先,假如没有反向边的话,那么找增广路其实是需要按照一定的组合,才能找到最大流。也就是说,我们无法在找到一条增广路时,确保这样可能是一种可行的最大流的方案。因此,我们需要对前面的方案进行调整,比如有的边流量不需要使用,需要“退”回去,反向边就起到这样的作用。
- 在实际运行过程中反向边与原来的边是没有区分的,这样一步步找增广路就可以确保最终为最大流。
EdmondsKarp
![](/assets/blank.gif)
![](/assets/blank.gif)
1 int bfs() { 2 memset(pre,-1,sizeof(pre)); 3 for(int i=1;i<=n;++i) 4 flow[i]=INF; 5 queue<int>q; 6 pre[S]=0,q.push(S); 7 while(!q.empty()){ 8 int op(q.front()); 9 q.pop(); 10 for(int i=1;i<=n;++i){ 11 if(i==S||pre[i]!=-1||c[op][i]==0) 12 continue; 13 pre[i]=op; //找到未遍历过的点 14 flow[i]=min(flow[op],c[op][i]); // 更行路径上的最小值 15 q.push(i); 16 } 17 } 18 if(flow[T]==INF) 19 return -1; 20 return flow[T]; 21 } 22 int solve() { 23 int ans(0); 24 while(1){ 25 int k(bfs()); 26 if(k==-1) 27 break; 28 ans+=k; 29 int nw(T); 30 while(nw!=S){//更新残余网络 31 c[pre[nw]][nw]-=k,c[nw][pre[nw]]+=k; 32 nw=pre[nw]; 33 } 34 } 35 return ans; 36 }
View Code
Dinic
- bfs建立层次图
- 在层次图中dfs直到找不到增广路
- 重复以上过程直到找不到增广路
![](/assets/blank.gif)
![](/assets/blank.gif)
1 bool bfs(){//bfs建立层次图 2 memset(dep,0,sizeof(dep)); 3 hd=tl=0; 4 q[++tl]=s; 5 dep[s]=1; 6 while(hd<tl){ 7 int op(q[++hd]); 8 for(int i=headlist[op];i!=-1;i=edge[i].next){ 9 if(edge[i].val&&(!dep[edge[i].v])){ 10 dep[edge[i].v]=dep[op]+1; 11 q[++tl]=edge[i].v; 12 if(edge[i].v==t)//遍历到t就返回,此时该层次图已建好 13 return true;//再访问其它的点没有必要 14 } 15 } 16 } 17 return false; 18 } 19 int dfs(int op,int fw){ 20 if(op==t) 21 return fw; 22 int tmp(fw),k; 23 for(int i=headlist[op];i!=-1;i=edge[i].next){ 24 if(edge[i].val&&tmp&&dep[edge[i].v]==dep[op]+1){ 25 k=dfs(edge[i].v,min(edge[i].val,tmp)); 26 if(!k){//该点后面没有路径,所以要从层次图中删去 27 dep[edge[i].v]=0;//因为和当前点op层次相同的点 28 continue;//还可能会访问到它 29 } 30 edge[i].val-=k; 31 edge[i^1].val+=k; 32 tmp=k; 33 } 34 } 35 return fw-tmp; 36 }
View Code
搭配飞行员
![](/assets/blank.gif)
![](/assets/blank.gif)
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<queue> 5 using namespace std; 6 int n,n1,n2; 7 struct edge{ 8 int s,e,n,w; 9 }a[2001]; 10 int pre[101],tot; 11 inline void insert(int s,int e,int w){ 12 a[tot].s=s; 13 a[tot].e=e; 14 a[tot].w=w; 15 a[tot].n=pre[s]; 16 pre[s]=tot++; 17 } 18 int x,y; 19 int sup; 20 int inf(0x7fffffff); 21 int adj[101]; 22 int dis[101]; 23 inline bool bfs(int s,int t){ 24 memset(dis,0,sizeof(dis)); 25 queue<int>q; 26 q.push(s); 27 dis[s]=1; 28 while(!q.empty()){ 29 int k(q.front()); 30 q.pop(); 31 for(int i=pre[k];i!=-1;i=a[i].n){ 32 if(!a[i].w||dis[a[i].e]) 33 continue; 34 dis[a[i].e]=dis[k]+1; 35 if(a[i].e==t) 36 return true; 37 q.push(a[i].e); 38 } 39 } 40 return false; 41 } 42 inline int my_min(int a,int b){ 43 return a<b?a:b; 44 } 45 inline int dfs(int now,int flow){ 46 if(now==sup) 47 return flow; 48 int tmp(flow),f; 49 for(int i=pre[now];i!=-1;i=a[i].n){ 50 if(!a[i].w||!tmp||dis[a[i].e]!=dis[now]+1) 51 continue; 52 f=dfs(a[i].e,my_min(a[i].w,tmp)); 53 if(!f){ 54 dis[a[i].e]=0; 55 continue; 56 } 57 a[i].w-=f; 58 a[i^1].w+=f; 59 tmp-=f; 60 } 61 return flow-tmp; 62 } 63 inline void dinic(int s,int t){ 64 int ans(0); 65 //bfs(s,t);cout<<"j"; 66 while(bfs(s,t)) 67 ans+=dfs(s,inf); 68 printf("%d",ans); 69 } 70 inline int gg(){ 71 freopen("flyer.in","r",stdin); 72 freopen("flyer.out","w",stdout); 73 memset(pre,-1,sizeof(pre)); 74 scanf("%d%d",&n,&n1); 75 sup=n+1; 76 n2=n-n1; 77 while(scanf("%d%d",&x,&y)==2) 78 insert(x,y,1),insert(y,x,0); 79 for(int i=1;i<=n1;i++) 80 insert(0,i,1),insert(i,0,0); 81 for(int i=n1+1,j=1;j<=n2;j++,i++) 82 insert(i,sup,1),insert(sup,i,0); 83 dinic(0,sup); 84 } 85 int K(gg()); 86 int main(){;}
View Code
士兵占领
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<queue> 5 using namespace std; 6 inline int read(){ 7 int sum(0); 8 char ch(getchar()); 9 for(;ch<'0'||ch>'9';ch=getchar()); 10 for(;ch>='0'&&ch<='9';sum=sum*10+ch-'0',ch=getchar()); 11 return sum; 12 } 13 struct edge{ 14 int s,e,w,n; 15 }a[50001]; 16 int pre[250],tot; 17 inline void insert(int s,int e,int w){ 18 a[tot].s=s; 19 a[tot].e=e; 20 a[tot].w=w; 21 a[tot].n=pre[s]; 22 pre[s]=tot++; 23 } 24 int n,m,k; 25 int sup; 26 int l[101],c[101]; 27 bool g[101][101]; 28 int sum(0); 29 int dis[301]; 30 inline bool bfs(int s,int t){ 31 memset(dis,0,sizeof(dis)); 32 queue<int>q; 33 q.push(s); 34 dis[s]=1; 35 while(!q.empty()){ 36 int k(q.front()); 37 q.pop(); 38 for(int i=pre[k];i!=-1;i=a[i].n){ 39 if(!a[i].w||dis[a[i].e]) 40 continue; 41 dis[a[i].e]=dis[k]+1; 42 if(a[i].e==t) 43 return true; 44 q.push(a[i].e); 45 } 46 } 47 return false; 48 } 49 inline int my_min(int a,int b){ 50 return a<b?a:b; 51 } 52 inline int dfs(int now,int flow){ 53 if(now==sup) 54 return flow; 55 int tmp(flow),f; 56 for(int i=pre[now];i!=-1;i=a[i].n){ 57 if(!a[i].w||!tmp||dis[a[i].e]!=dis[now]+1) 58 continue; 59 f=dfs(a[i].e,my_min(a[i].w,tmp)); 60 if(!f){ 61 dis[a[i].e]=0; 62 continue; 63 } 64 a[i].w-=f; 65 a[i^1].w+=f; 66 tmp-=f; 67 } 68 return flow-tmp; 69 } 70 inline bool judge(){ 71 int tmp; 72 for(int i=1;i<=m;i++){ 73 tmp=0; 74 for(int j=1;j<=n;j++) 75 if(g[i][j]) 76 tmp++; 77 if(tmp<l[i]) 78 return true; 79 } 80 for(int j=1;j<=n;j++){ 81 tmp=0; 82 for(int i=1;i<=m;i++) 83 if(g[i][j]) 84 tmp++; 85 if(tmp<c[j]) 86 return true; 87 } 88 return false; 89 } 90 int ans(0),inf(0x7fffffff); 91 int main(){ 92 memset(pre,-1,sizeof(pre)); 93 memset(g,true,sizeof(g)); 94 m=read(),n=read(),k=read(); 95 sup=n+m+1; 96 for(int i=1;i<=m;i++) 97 l[i]=read(),sum+=l[i]; 98 for(int i=1;i<=n;i++) 99 c[i]=read(),sum+=c[i]; 100 for(int i=1;i<=k;i++){ 101 int x(read()),y(read()); 102 g[x][y]=0; 103 } 104 if(judge()){ 105 puts("JIONG!"); 106 return 0; 107 } 108 for(int i=1;i<=m;i++) 109 for(int j=1;j<=n;j++) 110 if(g[i][j]) 111 insert(i,j+m,1),insert(j+m,i,0); 112 for(int i=1;i<=m;i++) 113 insert(0,i,l[i]),insert(i,0,0); 114 for(int i=1;i<=n;i++) 115 insert(i+m,sup,c[i]),insert(sup,i+m,0); 116 while(bfs(0,sup)) 117 ans+=dfs(0,inf); 118 printf("%d",sum-ans); 119 return 0; 120 }
View Code
分子切割
紧急疏散
Collector's Problem
最小割
定义
把所有的结点分为两个集合S和T,其中s在S中,t在T中。把所有起点在S中,终点在T中的边删除,就无法从s到达t了,这样的一个划分称为s-t割,它的容量为删除的所有边的容量的总值,最小割即为所有s-t割中的最小值。
求解最小割基于一个事实:最小割等于最大流
王者之剑
![](/assets/blank.gif)
![](/assets/blank.gif)
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<queue> 5 using namespace std; 6 inline int read(){ 7 int sum(0); 8 char ch(getchar()); 9 for(;ch<'0'||ch>'9';ch=getchar()); 10 for(;ch>='0'&&ch<='9';sum=sum*10+(ch^48),ch=getchar()); 11 return sum; 12 } 13 struct edge{ 14 int e,n,w; 15 }a[2000001]; 16 int pre[100001],tot; 17 inline void insert(int s,int e,int w){ 18 a[tot].e=e; 19 a[tot].w=w; 20 a[tot].n=pre[s]; 21 pre[s]=tot++; 22 } 23 int n,m; 24 int w[105][105],col[105][105]; 25 inline void paint(){ 26 int now(1); 27 for(int i=1;i<=n;i++){ 28 now^=1; 29 for(int j=1;j<=m;j++){ 30 if(j&1) 31 col[i][j]=now; 32 else 33 col[i][j]=now^1; 34 } 35 } 36 } 37 int S(0),T; 38 int ans(0),inf(0x7fffffff),sum(0); 39 inline void build(){ 40 for(int i=1;i<=n;i++) 41 for(int j=1;j<=m;j++){ 42 if(col[i][j]) 43 insert(S,(i-1)*m+j,w[i][j]),insert((i-1)*m+j,S,0); 44 else 45 insert((i-1)*m+j,T,w[i][j]),insert(T,(i-1)*m+j,0); 46 } 47 for(int i=1;i<=n;i++) 48 for(int j=1;j<=m;j++){ 49 if(col[i][j]){ 50 if(i!=1) 51 insert((i-2)*m+j,(i-1)*m+j,0),insert((i-1)*m+j,(i-2)*m+j,inf); 52 if(i!=n) 53 insert(i*m+j,(i-1)*m+j,0),insert((i-1)*m+j,i*m+j,inf); 54 if(j!=1) 55 insert((i-1)*m+j-1,(i-1)*m+j,0),insert((i-1)*m+j,(i-1)*m+j-1,inf); 56 if(j!=m) 57 insert((i-1)*m+j+1,(i-1)*m+j,0),insert((i-1)*m+j,(i-1)*m+j+1,inf); 58 } 59 } 60 } 61 int dis[10010]; 62 inline bool bfs(int s,int t){ 63 memset(dis,0,sizeof(dis)); 64 dis[s]=1; 65 queue<int>q; 66 q.push(s); 67 while(!q.empty()){ 68 int k(q.front()); 69 q.pop(); 70 for(int i=pre[k];i!=-1;i=a[i].n){ 71 int e(a[i].e); 72 if(!dis[e]&&a[i].w){ 73 dis[e]=dis[k]+1; 74 q.push(e); 75 if(e==t) 76 return true; 77 } 78 } 79 } 80 return false; 81 } 82 inline int my_min(int a,int b){ 83 return a<b?a:b; 84 } 85 inline int dfs(int now,int flow){ 86 if(now==T) 87 return flow; 88 int tmp(flow),f; 89 for(int i=pre[now];i!=-1;i=a[i].n){ 90 int e(a[i].e); 91 if(dis[e]==dis[now]+1&&tmp&&a[i].w){ 92 f=dfs(e,my_min(tmp,a[i].w)); 93 if(!f){ 94 dis[e]=0; 95 continue; 96 } 97 a[i].w-=f; 98 a[i^1].w+=f; 99 tmp-=f; 100 } 101 } 102 return flow-tmp; 103 } 104 inline int gg(){ 105 freopen("Excalibur.in","r",stdin); 106 freopen("Excalibur.out","w",stdout); 107 memset(pre,-1,sizeof(pre)); 108 n=read(),m=read(); 109 T=n*m+1; 110 for(int i=1;i<=n;i++) 111 for(int j=1;j<=m;j++) 112 w[i][j]=read(),sum+=w[i][j]; 113 paint(); 114 build(); 115 while(bfs(S,T)) 116 ans+=dfs(S,inf); 117 printf("%d",sum-ans); 118 return 0; 119 } 120 int K(gg()); 121 int main(){;}
View Code
happiness
![](/assets/blank.gif)
![](/assets/blank.gif)
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<queue> 5 using namespace std; 6 inline int read(){ 7 int sum(0); 8 char ch(getchar()); 9 for(;ch<'0'||ch>'9';ch=getchar()); 10 for(;ch>='0'&&ch<='9';sum=sum*10+(ch^48),ch=getchar()); 11 return sum; 12 } 13 struct edge{ 14 int e,n,w; 15 }a[200001]; 16 int pre[10010],tot; 17 inline void insert(int s,int e,int w){ 18 a[tot].e=e; 19 a[tot].w=w; 20 a[tot].n=pre[s]; 21 pre[s]=tot++; 22 } 23 int n,m; 24 int w[101][101],l[101][101]; 25 int jz1[101][101],jz2[101][101],jz3[101][101],jz4[101][101]; 26 int sum(0),ans(0),inf(0x7fffffff); 27 int S(0),T; 28 int id[101][101]; 29 inline void init(){ 30 freopen("nt2011_happiness.in","r",stdin); 31 freopen("nt2011_happiness.out","w",stdout); 32 memset(pre,-1,sizeof(pre)); 33 n=read(),m=read(); 34 T=n*m+1; 35 for(int i=1;i<=n;i++) 36 for(int j=1;j<=m;j++) 37 w[i][j]=read()<<1,sum+=w[i][j]>>1,id[i][j]=(i-1)*m+j; 38 for(int i=1;i<=n;i++) 39 for(int j=1;j<=m;j++) 40 l[i][j]=read()<<1,sum+=l[i][j]>>1; 41 for(int i=1;i<n;i++) 42 for(int j=1;j<=m;j++) 43 jz1[i][j]=read(),sum+=jz1[i][j]; 44 for(int i=1;i<n;i++) 45 for(int j=1;j<=m;j++) 46 jz2[i][j]=read(),sum+=jz2[i][j]; 47 for(int i=1;i<=n;i++) 48 for(int j=1;j<m;j++) 49 jz3[i][j]=read(),sum+=jz3[i][j]; 50 for(int i=1;i<=n;i++) 51 for(int j=1;j<m;j++) 52 jz4[i][j]=read(),sum+=jz4[i][j]; 53 } 54 inline void build(){ 55 for(int i=1;i<=n;i++) 56 for(int j=1;j<=m;j++){ 57 insert(S,id[i][j],w[i][j]+jz1[i][j]+jz1[i-1][j]+jz3[i][j]+jz3[i][j-1]),insert(id[i][j],S,0); 58 insert(id[i][j],T,l[i][j]+jz2[i][j]+jz2[i-1][j]+jz4[i][j]+jz4[i][j-1]),insert(T,id[i][j],0); 59 } 60 for(int i=1;i<=n;i++) 61 for(int j=1;j<=m;j++){ 62 if(i!=n) 63 insert(id[i][j],id[i][j]+m,jz1[i][j]+jz2[i][j]),insert(id[i][j]+m,id[i][j],jz1[i][j]+jz2[i][j]); 64 if(j!=m) 65 insert(id[i][j],id[i][j]+1,jz3[i][j]+jz4[i][j]),insert(id[i][j]+1,id[i][j],jz3[i][j]+jz4[i][j]); 66 } 67 } 68 int dis[10020]; 69 inline bool bfs(int s,int t){ 70 memset(dis,0,sizeof(dis)); 71 dis[s]=1; 72 queue<int>q; 73 q.push(s); 74 while(!q.empty()){ 75 int k(q.front()); 76 q.pop(); 77 for(int i=pre[k];i!=-1;i=a[i].n){ 78 int e(a[i].e); 79 if(!dis[e]&&a[i].w){ 80 dis[e]=dis[k]+1; 81 q.push(e); 82 if(e==t) 83 return true; 84 } 85 } 86 } 87 return false; 88 } 89 inline int my_min(int a,int b){ 90 return a<b?a:b; 91 } 92 inline int dfs(int now,int flow){ 93 if(now==T) 94 return flow; 95 int tmp(flow),f; 96 for(int i=pre[now];i!=-1;i=a[i].n){ 97 int e(a[i].e); 98 if(dis[e]==dis[now]+1&&tmp&&a[i].w){ 99 f=dfs(e,my_min(tmp,a[i].w)); 100 if(!f){ 101 dis[e]=0; 102 continue; 103 } 104 a[i].w-=f; 105 a[i^1].w+=f; 106 tmp-=f; 107 } 108 } 109 return flow-tmp; 110 } 111 inline void dinic(){ 112 while(bfs(S,T)) 113 ans+=dfs(S,inf); 114 printf("%d",sum-(ans>>1)); 115 } 116 inline int gg(){ 117 init(); 118 build(); 119 dinic(); 120 return 0; 121 } 122 int K(gg()); 123 int main(){;}
View Code
人员雇佣
切糕
![](/assets/blank.gif)
![](/assets/blank.gif)
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<queue> 5 using namespace std; 6 inline int read(){ 7 int sum(0); 8 char ch(getchar()); 9 for(;ch<'0'||ch>'9';ch=getchar()); 10 for(;ch>='0'&&ch<='9';sum=sum*10+(ch^48),ch=getchar()); 11 return sum; 12 } 13 struct edge{ 14 int e,n,w; 15 }a[1000001]; 16 int pre[64500],tot; 17 inline void insert(int s,int e,int w){ 18 a[tot].e=e; 19 a[tot].w=w; 20 a[tot].n=pre[s]; 21 pre[s]=tot++; 22 } 23 int p,q,r,d; 24 int id[41][41][41],w[41][41][41]; 25 int cnt(0); 26 int S(0),T; 27 int ans(0),inf(0x7fffffff); 28 int dis[64500]; 29 inline bool bfs(int s,int t){ 30 memset(dis,0,sizeof(dis)); 31 dis[s]=1; 32 queue<int>q; 33 q.push(s); 34 while(!q.empty()){ 35 int k(q.front()); 36 q.pop(); 37 for(int i=pre[k];i!=-1;i=a[i].n){ 38 int e(a[i].e); 39 if(!dis[e]&&a[i].w){ 40 dis[e]=dis[k]+1; 41 q.push(e); 42 if(e==t) 43 return true; 44 } 45 } 46 } 47 return false; 48 } 49 inline int my_min(int a,int b){ 50 return a<b?a:b; 51 } 52 inline int dfs(int now,int flow){ 53 if(now==T) 54 return flow; 55 int tmp(flow),f; 56 for(int i=pre[now];i!=-1;i=a[i].n){ 57 int e(a[i].e); 58 if(dis[e]==dis[now]+1&&tmp&&a[i].w){ 59 f=dfs(e,my_min(tmp,a[i].w)); 60 if(!f){ 61 dis[e]=0; 62 continue; 63 } 64 a[i].w-=f; 65 a[i^1].w+=f; 66 tmp-=f; 67 } 68 } 69 return flow-tmp; 70 } 71 inline int gg(){ 72 freopen("nutcake.in","r",stdin); 73 freopen("nutcake.out","w",stdout); 74 memset(pre,-1,sizeof(pre)); 75 p=read(),q=read(),r=read(),d=read(); 76 T=p*q*r+1; 77 for(int i=1;i<=r;i++) 78 for(int j=1;j<=p;j++) 79 for(int k=1;k<=q;k++){ 80 w[i][j][k]=read(); 81 id[i][j][k]=++cnt; 82 insert(id[i-1][j][k],id[i][j][k],w[i][j][k]),insert(id[i][j][k],id[i-1][j][k],0); 83 if(i==r) 84 insert(id[i][j][k],T,inf),insert(T,id[i][j][k],0); 85 if(i>d){ 86 if(j!=1) 87 insert(id[i][j][k],id[i-d][j-1][k],inf),insert(id[i-d][j-1][k],id[i][j][k],0); 88 if(j!=p) 89 insert(id[i][j][k],id[i-d][j+1][k],inf),insert(id[i-d][j+1][k],id[i][j][k],0); 90 if(k!=1) 91 insert(id[i][j][k],id[i-d][j][k-1],inf),insert(id[i-d][j][k-1],id[i][j][k],0); 92 if(k!=q) 93 insert(id[i][j][k],id[i-d][j][k+1],inf),insert(id[i-d][j][k+1],id[i][j][k],0); 94 } 95 } 96 while(bfs(S,T)) 97 ans+=dfs(S,inf); 98 printf("%d",ans); 99 return 0; 100 } 101 int K(gg()); 102 int main(){;}
View Code
费用流
最小费用最大流
- 每次寻找的增广路的单位最小费用一定是不下降的。
- 寻找增广路的过程中不会出现负环。
- 局部最优一定是整体最优
![](/assets/blank.gif)
![](/assets/blank.gif)
1 bool FIND(int st,int ed,int &fw,int &Cost){ 2 memset(dis,0x3f,sizeof(dis)); 3 memset(ins,false,sizeof(ins)); 4 memset(pr,0,sizeof(pr)); 5 inf = dis[0]; 6 queue <int> q; 7 q.push(st), dis[st] = 0, a[st] = inf; 8 while(!q.empty()) { 9 int op = q.front(); q.pop(); 10 ins[q] = false; 11 for(int i = headlist[q] ; i != -1 ; i = Edge[i].next) { 12 if(Edge[i].val&&dis[Edge[i].v]>dis[op]+Edge[i].cost) { 13 dis[sg[i].v] = dis[op]+Edge[i].cost; 14 pr[Edge[i].v] = i; 15 a[Edge[i].v] = MIN(a[op],Edge[i].val); 16 if(!ins[Edge[i].v]) { 17 ins[Edge[i].v] = true; 18 q.push(Edge[i].v); 19 } 20 } 21 } 22 } 23 if(dis[ed]==inf) return false; 24 fw += a[ed]; 25 Cost += dis[ed]*a[ed]; 26 int w = ed; 27 while(w!=st) { 28 Edge[pr[w]].val -= a[ed]; 29 Edge[pr[w]^1].val += a[ed]; 30 w = Edge[pr[w]].u; 31 } 32 return true; 33 }
View Code
餐巾
![](/assets/blank.gif)
![](/assets/blank.gif)
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<queue> 5 using namespace std; 6 struct edge{ 7 int e,n,flow,cost; 8 }a[20010]; 9 int pre[410],tot; 10 inline void insert(int s,int e,int flow,int cost){ 11 a[tot].e=e; 12 a[tot].flow=flow; 13 a[tot].cost=cost; 14 a[tot].n=pre[s]; 15 pre[s]=tot++; 16 } 17 int S(0),T; 18 int N,p,m,f,n,s; 19 int r[201]; 20 int flow(0),ans(0),inf(0x7fffffff); 21 inline void build(){ 22 for(int i=1;i<=N;i++){ 23 insert(S,i,r[i],0),insert(i,S,0,0); 24 insert(S,i+N,inf,p),insert(i+N,S,0,-p); 25 insert(i+N,T,r[i],0),insert(T,i+N,0,0); 26 if(i+m<=N) 27 insert(i,i+m+N,inf,f),insert(i+m+N,i,0,-f); 28 if(i+n<=N) 29 insert(i,i+n+N,inf,s),insert(i+n+N,i,0,-s); 30 if(i!=N) 31 insert(i,i+1,inf,0),insert(i+1,i,0,0); 32 } 33 } 34 int dis[410],fa[410],path[410]; 35 inline bool bfs(){ 36 memset(dis,30,sizeof(dis)); 37 memset(fa,-1,sizeof(fa)); 38 queue<int>q; 39 q.push(S); 40 dis[S]=0; 41 while(!q.empty()){ 42 int k(q.front()); 43 q.pop(); 44 for(int i=pre[k];i!=-1;i=a[i].n){ 45 int e(a[i].e); 46 if(a[i].flow&&dis[e]>dis[k]+a[i].cost){ 47 dis[e]=dis[k]+a[i].cost; 48 fa[e]=k; 49 path[e]=i; 50 q.push(e); 51 } 52 } 53 } 54 if(fa[T]==-1) 55 return false; 56 return true; 57 } 58 inline void dinic(){ 59 while(bfs()){ 60 int f(inf); 61 for(int i=T;i!=S;i=fa[i]) 62 if(a[path[i]].flow<f) 63 f=a[path[i]].flow; 64 flow+=f; 65 ans+=dis[T]*f; 66 for(int i=T;i!=S;i=fa[i]){ 67 a[path[i]].flow-=f; 68 a[path[i]^1].flow+=f; 69 } 70 } 71 } 72 inline int gg(){ 73 freopen("napkin.in","r",stdin); 74 freopen("napkin.out","w",stdout); 75 memset(pre,-1,sizeof(pre)); 76 scanf("%d",&N); 77 T=(N<<1)+1; 78 for(int i=1;i<=N;i++) 79 scanf("%d",&r[i]); 80 scanf("%d%d%d%d%d",&p,&m,&f,&n,&s); 81 build(); 82 dinic(); 83 printf("%d",ans); 84 return 0; 85 } 86 int K(gg()); 87 int main(){;}
View Code
球队收益
剪刀石头布
总结?
彩蛋
转载于:https://www.cnblogs.com/hzoi-mafia/p/7277677.html
[补档]2017-7-29 大佬讲课笔记相关推荐
- 【补档2017.12.28】我的2017-漫长的苦痛与渐入佳境的愤怒
2017的第一个季度我一直在想用瑞萨做一款飞控出来,选传感器到AD画板再到e2studio新建工程,之所以这么笃信瑞萨,是因为我当时满脑子想着我要去日本,电子设计国赛日企瑞萨赞助,控制题必考四轴,做出 ...
- 自然语言处理技术(NLP)在推荐系统中的应用 原2017.06.29人工智能头条 作者: 张相於,58集团算法架构师,转转搜索推荐部负责人,负责搜索、推荐以及算法相关工作。多年来主要从事推荐系统以及机
自然语言处理技术(NLP)在推荐系统中的应用 原2017.06.29人工智能头条 作者: 张相於,58集团算法架构师,转转搜索推荐部负责人,负责搜索.推荐以及算法相关工作.多年来主要从事推荐系统以及机 ...
- [补档]暑假集训D5总结
%dalao 今天又有dalao来讲课,讲的是网络流 网络流--从入门到放弃:7-29dalao讲课笔记--https://hzoi-mafia.github.io/2017/07/29/27/ 果然 ...
- 2017/12/29
2019独角兽企业重金招聘Python工程师标准>>> 2017/12/29 Firday weather: light rain ! 1.需求: 写一个脚本实现如下功能: 输入一个 ...
- 死性不改【17Fi】ISO9000 Win7x64专业版、WS2008r2企业版GHO下载 2017.06.29
死性不改[17Fi]ISO9000 Win7x64专业版.WS2008r2企业版GHO下载 2017.06.29 2017年06月29日 系统分享 评论 2 条 阅读 2,341 次 最新版本:17F ...
- 死性不改【17Fi】网维大师(简写:WWDS)Win7x64无盘万能包下载 2017.06.29
死性不改[17Fi]网维大师(简写:WWDS)Win7x64无盘万能包下载 2017.06.29 2017年06月29日 万能公包 暂无评论 阅读 1,957 次 最新版本:17Fi 发布日期:201 ...
- [补档]暑假集训D2总结
%dalao https://hzoi-mafia.github.io/2017/07/26/17/ (纪念我已死去的github) 大佬AntiLeaf来讲概率&期望,然后--成功变为 不可 ...
- 【一周头条盘点】中国软件网(2017.12.25~2017.12.29)
每一个企业级的人 都置顶了 中国软件网 中国软件网 为你带来最新鲜的行业干货 趋势洞察 麦肯锡:人工智能三个关键业务方向一个最大问题 麦肯锡表示:关于人工智能的三个关键业务方面开始逐渐明朗化. 第一, ...
- 2017还有29天,你的目标实现了吗?|内有彩蛋
点开标题的,都有一颗大心脏.2017 就要这么过去了,细思极恐啊同志们,年初定下的目标,你实现了几个? 如果这里是一个树洞,你将对着它说点什么呢? 如果你敢留下感想,我们就敢让它上墙. 有人说:&qu ...
最新文章
- 一文读懂机器学习项目的完整生命周期
- Excel直接转图片
- 算法笔记_156:算法提高 6-17复数四则运算(Java)
- flex 动态显示时间
- nginx delete form表单 收不到参数_HTTP 文件上传的一个后端完善方案(NginX)
- 【SpringCloud】服务网关 gateway 和 zuul
- 所有controller interceptor_阿里二面:filter、interceptor、aspect应如何选择?很多人中招...
- ExtAspNet应用技巧(七) - ViewState优化
- 设计python游戏贪吃蛇_Python 贪吃蛇游戏
- stata15中文乱码_一次性解决Stata中文乱码问题
- 软件系统安全性测试列表
- 解决主机ping不通xp虚拟机
- adb shell 小米手机_【ADB命令实战】免ROOT停用小米手机系统应用
- python 生信分析_生信分析之Python学习1
- mac-os big sur -brew安装jq缺少文件
- 红警conquer.mix文件
- 千兆光模块如何与交换机搭配使用?
- Ubuntu 22.4网易云音乐启动失败处理方法
- L. Lifeguards(平面几何 点平分成两边)
- OSPF的NBMA环境建立邻居及排错,理论+实战讲解,干货分享
热门文章
- 关于element table 动态表头+动态表头及内容+表格优化+初始化表格+隐藏功能,技术提升请来!
- (idea配置-格式化html)
- 【报告分享】喜茶2020年度报告-喜茶(附下载)
- 生日快乐歌(程序员版)
- 安装captcha-killer-modified插件(windos+python环境)
- 【IDEA】IDEA相关
- Postman完全卸载步骤
- YUI Compressor快速使用指南—web前端开发七武器
- 【原创】项目估算-项目管理MSN群线上讨论(2009.6.30)
- C# winform 实习语音播报