刷题计划

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了刷题计划相关的知识,希望对你有一定的参考价值。

开个坑不然刷题没动力QAQ

干脆叫做刷题计划。。。

既然开了坑就要填满QWQ,加油!

正好实力弱多刷题也挺好的QAQ

1/50

Bzoj-1001 狼抓兔子 

题意:求最小割

分析:因为最小割=最大流,直接跑一遍dinic求最大流就好了。最大流参照的是黄学长的模板

代码:

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<vector>
#include<map>
#include<queue> 
#include<algorithm>
using namespace std;
#define maxn 1000005
#define ll long long
int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
    return x*f;
}
int n,m;
int h[maxn],q[maxn];
struct pos{
	int to,from,v,nxt;
}e[maxn*6];
int head[maxn],edge;
void add(int x,int y,int z){
	e[++edge].to=y;e[edge].from=x;e[edge].v=z;
	e[edge].nxt=head[x];head[x]=edge;
}
bool bfs(){
	int now;memset(h,-1,sizeof(h));
	int hd=0,tl=1;
	q[hd]=1;h[1]=0;
	while(hd!=tl){
		now=q[hd++];
		for(int i=head[now];i;i=e[i].nxt){
			if(e[i].v&&h[e[i].to]==-1){
				h[e[i].to]=h[now]+1;
				q[tl++]=e[i].to;
			}
		}
	}
	return h[n*m]!=-1;
}
int dfs(int x,int mn){
	if(x==n*m) return mn;
	int w,used=0;
	for(int i=head[x];i;i=e[i].nxt)
		if(e[i].v&&h[e[i].to]==h[x]+1){
			w=mn-used;w=dfs(e[i].to,min(w,e[i].v));
			e[i].v-=w;
			e[i+1].v+=w;
			used+=w;
			if(used==mn) return mn;
		}
	if(!used) h[x]=-1;
	return used;
}
int ans;
int dinic(){while(bfs())ans+=dfs(1,0x7fffffff);}
int main(){
	n=read();m=read();
	for(int i=1;i<=n;i++)
		for(int j=1;j<m;j++){
			int x=read();
			add((i-1)*m+j,(i-1)*m+j+1,x);
			add((i-1)*m+j+1,(i-1)*m+j,x);
		}
	for(int i=1;i<n;i++)
		for(int j=1;j<=m;j++){
			int x=read();
			add((i-1)*m+j,i*m+j,x);
			add(i*m+j,(i-1)*m+j,x);
		}
	for(int i=1;i<n;i++)
		for(int j=1;j<m;j++){
			int x=read();
			add((i-1)*m+j,i*m+j+1,x);
			add(i*m+j+1,(i-1)*m+j,x);
		}
	dinic();printf("%d\n",ans);
}

 

未完待续

 

以上是关于刷题计划的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 20天算法刷题计划第三天:双指针

LeetCode刷题计划

LeetCode刷题计划

LeetCode刷题计划

LeetCode刷题计划

Java工程师面试题,二级java刷题软件