说出来你们可能不信,我咕了三个多星期了,今晚忽然不想再写题了,(写自闭了,把这边整理一下

1. 洛谷P2756 飞行员配对问题

二分图匹配:

 #include <bits/stdc++.h>
using namespace std;
int m,n,a,b;
const int MAXN = ;
int g[MAXN][MAXN];
int linker[MAXN],used[MAXN];
bool dfs(int u){
for(int v=;v<=n;v++){
if(g[u][v]&&!used[v]){
used[v]=true;
if(linker[v]==-||dfs(linker[v])){
linker[v]=u;//这俩匹配上了
return true;
}
}
}
return false;
}
int hungary(){
int res = ;
memset(linker,-, sizeof(linker));
for(int u=;u<=m;u++){
memset(used,, sizeof(used));
if(dfs(u))
res++;
}
return res;
}
int main(){
ios::sync_with_stdio(false);
cin>>m>>n;
while (cin>>a>>b&&a!=-&&b!=-){
g[a][b]=;
}
cout<<hungary()<<endl;
for(int i=;i<=n;i++){
if(linker[i]!=-)
cout<<linker[i]<<' '<<i<<endl;
}
}

最大流EK:

 #include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
struct edge{
int to,cap,rev;
};
vector<edge> g[];
bool used[];
void addEdge(int from,int to,int cap){//s到t流量为cap
g[from].push_back((edge){to,cap,g[to].size()});
g[to].push_back((edge){from,,g[from].size()-});
}
int dfs(int v,int t,int f){
if(v==t)
return f;
used[v]=true;
for(int i=;i<g[v].size();i++){
edge &e = g[v][i];
if(!used[e.to]&&e.cap>){//这算法竟该死的朴实
int d = dfs(e.to,t,min(f,e.cap));
if(d>){
e.cap-=d;
g[e.to][e.rev].cap+=d;
return d;
}
}
}
return ;
}
int max_flow(int s,int t){
int flow = ;
for(;;){
memset(used,, sizeof(used));
int f = dfs(s,t,INF);
if(f==) return flow;
flow += f;
}
}
int m,n,a,b;
int main(){
ios::sync_with_stdio(false);
cin>>m>>n;
while (cin>>a>>b&&a!=-&&b!=-){
addEdge(a,b+m,);
}
int S = ,END = m+n+;
for(int i=;i<=m;i++){
addEdge(S,i,);
}
for(int i=m+;i<=m+n;i++){
addEdge(i,END,);
}
cout<<max_flow(,n+m+)<<endl;
for(int i=;i<=m;i++){
for(int j=;j<g[i].size();j++) {
edge tmp = g[i][j];
if (tmp.cap == &&g[i][j].to!=) {
cout << i<<' '<<g[i][j].to-m<<endl;
break;
}
}
}
}

2.P4016 负载平衡问题

费用流,首先相邻的仓库连流量INF费用为1的边。然后我们算出来平均数ave,如果这个仓库货物大于ave,就从源点连一个a[i]-ave的边,小于的话向汇点连一个ave-a[i]的边。

 #include <bits/stdc++.h>
using namespace std;
const int MAXN = ;
const int MAXM = ;
const int INF = 0x3f3f3f3f;
struct Edge{
int to,next,cap,flow,cost;
}edge[MAXM];
int head[MAXN],tol;
int pre[MAXN],dis[MAXN];
bool vis[MAXN];
int N;
void init(int all){
N = all;
tol = ;
memset(head,-, sizeof(head));
}
void addEdge(int u,int v,int cap,int cost){
edge[tol].to=v;
edge[tol].cap = cap;
edge[tol].cost = cost;
edge[tol].flow = ;
edge[tol].next = head[u];
head[u]=tol++;
edge[tol].to=u;
edge[tol].cap = ;
edge[tol].cost= -cost;
edge[tol].flow=;
edge[tol].next=head[v];
head[v]=tol++;
}
bool spfa(int s,int t){
queue<int> q;
for(int i=;i<N;i++){
dis[i]=INF;
vis[i] = false;
pre[i]=-;
}
dis[s]=;
vis[s]=true;
q.push(s);
while (!q.empty()){
int u = q.front();
q.pop();
vis[u]=false;
for(int i=head[u];i!=-;i=edge[i].next){
int v = edge[i].to;
if(edge[i].cap>edge[i].flow&&dis[v]>dis[u]+edge[i].cost){
dis[v]=dis[u]+edge[i].cost;
pre[v]=i;
if(!vis[v]){
vis[v]=true;
q.push(v);
}
}
}
}
if(pre[t]==-)return false;
return true;
}
int minCostMaxFlow(int s,int t,int &cost){
int flow = ;
cost = ;
while (spfa(s,t)){
int Min = INF;
for(int i=pre[t];i!=-;i=pre[edge[i^].to]){
//从最后一个点,向前遍历取最小值
if(Min>edge[i].cap-edge[i].flow)
Min = edge[i].cap-edge[i].flow;
}
for(int i=pre[t];i!=-;i=pre[edge[i^].to]){
edge[i].flow+=Min;
edge[i^].flow-=Min;
cost+=edge[i].cost*Min;
}
flow+=Min;
}
return flow;
}
int main(){
ios::sync_with_stdio(false);
int n;
int a[];
int sum = ;
cin>>n;
for(int i=;i<=n;i++) {
cin >> a[i];
sum+=a[i];
}
sum/=n;
init(n+);
for(int i=;i<=n;i++){
if(a[i]>sum){
addEdge(,i,a[i]-sum,);
} else if(a[i]<sum){
addEdge(i,n+,sum-a[i],);
}
if(i!=n){
addEdge(i,i+,INF,);
addEdge(i+,i,INF,);
} else{
addEdge(i,,INF,);
addEdge(,i,INF,);
}
}
int ans = ;
minCostMaxFlow(,n+,ans);
cout<<ans<<endl;
}

3.P4015  运输问题

费用流,全裸的吧,啊啊啊什么全裸??

 #include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = ;
const int MAXM = ;
const int INF = 0x3f3f3f3f;
int n,m;
struct Edge{
int to,next,cap,flow,cost;
}edge[MAXM];
int head[MAXN],tol;
int pre[MAXN],dis[MAXN];
bool vis[MAXN];
void init(){
tol = ;
memset(head,-, sizeof(head));
}
void addEdge(int u,int v,int cap,int cost){
edge[tol].to=v;
edge[tol].cap = cap;
edge[tol].cost = cost;
edge[tol].flow = ;
edge[tol].next = head[u];
head[u]=tol++;
edge[tol].to = u;
edge[tol].cap = ;
edge[tol].cost = -cost;
edge[tol].flow = ;
edge[tol].next = head[v];
head[v]=tol++;
}
bool spfa(int s,int t,int N){
queue<int> q;
for(int i=;i<N;i++){
dis[i]=INF;
vis[i] = false;
pre[i]=-;
}
dis[s]=;
vis[s]=true;
q.push(s);
while (!q.empty()){
int u = q.front();
q.pop();
vis[u] = false;
for(int i=head[u];i!=-;i=edge[i].next){
int v = edge[i].to;
if(edge[i].cap>edge[i].flow&&dis[v]>dis[u]+edge[i].cost){
dis[v]=dis[u]+edge[i].cost;
pre[v]=i;
if(!vis[v]){
vis[v]=true;
q.push(v);
}
}
}
}
if(pre[t]==-)return false;
return true;
}
ll minCostMaxFlow(int s,int t,ll &cost,int N){
int flow = ;
cost = ;
while (spfa(s,t,N)){
int Min = INF;
for(int i=pre[t];i!=-;i=pre[edge[i^].to]){
if(Min>edge[i].cap-edge[i].flow)
Min = edge[i].cap-edge[i].flow;
}
for(int i=pre[t];i!=-;i=pre[edge[i^].to]){
edge[i].flow+=Min;
edge[i^].flow-=Min;
cost+=1ll*edge[i].cost*Min;
}
}
return flow;
} int a[],b[],g[][];
int main(){
init();
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=;i<=n;i++){
cin>>a[i];
addEdge(,i,a[i],);
}
for(int i=;i<=m;i++){
cin>>b[i];
addEdge(i+n,n+m+,b[i],);
}
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
cin>>g[i][j];
addEdge(i,j+n,INF,g[i][j]);
}
}
ll cost = ;
minCostMaxFlow(,n+m+,cost,n+m+);
cout<<cost<<endl;
cost = ;
init();
for(int i=;i<=n;i++){
addEdge(,i,a[i],);
}
for(int i=;i<=m;i++){
addEdge(i+n,n+m+,b[i],);
}
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
addEdge(i,j+n,INF,-g[i][j]);
}
}
minCostMaxFlow(,n+m+,cost,n+m+);
cout<<-cost<<endl;
}

4. 4014 分配问题

费用流&二分图完美匹配,只写了费用流的做法,这道题建图也很显然吧。。。

 #include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = ;
const int MAXM = ;
const int INF = 0x3f3f3f3f;
struct Edge{
int to,next,cap,flow,cost;
}edge[MAXM];
int head[MAXN],tol;
int pre[MAXN],dis[MAXN];
bool vis[MAXN];
void init(){
tol = ;
memset(head,-, sizeof(head));
}
void addEdge(int u,int v,int cap,int cost){
edge[tol].to=v;
edge[tol].cap = cap;
edge[tol].cost = cost;
edge[tol].flow = ;
edge[tol].next = head[u];
head[u]=tol++;
edge[tol].to = u;
edge[tol].cap = ;
edge[tol].cost = -cost;
edge[tol].flow = ;
edge[tol].next = head[v];
head[v]=tol++;
}
bool spfa(int s,int t,int N){
queue<int> q;
for(int i=;i<N;i++){
dis[i]=INF;
vis[i] = false;
pre[i]=-;
}
dis[s]=;
vis[s]=true;
q.push(s);
while (!q.empty()){
int u = q.front();
q.pop();
vis[u] = false;
for(int i=head[u];i!=-;i=edge[i].next){
int v = edge[i].to;
if(edge[i].cap>edge[i].flow&&dis[v]>dis[u]+edge[i].cost){
dis[v]=dis[u]+edge[i].cost;
pre[v]=i;
if(!vis[v]){
vis[v]=true;
q.push(v);
}
}
}
}
if(pre[t]==-)return false;
return true;
}
ll minCostMaxFlow(int s,int t,ll &cost,int N){
int flow = ;
cost = ;
while (spfa(s,t,N)){
int Min = INF;
for(int i=pre[t];i!=-;i=pre[edge[i^].to]){
if(Min>edge[i].cap-edge[i].flow)
Min = edge[i].cap-edge[i].flow;
}
for(int i=pre[t];i!=-;i=pre[edge[i^].to]){
edge[i].flow+=Min;
edge[i^].flow-=Min;
cost+=1ll*edge[i].cost*Min;
}
}
return flow;
}
int n;
int g[][];
int main(){
ios::sync_with_stdio(false);
init();
cin>>n;
for(int i=;i<=n;i++){
addEdge(,i,,);
for(int j=;j<=n;j++){
cin>>g[i][j];
addEdge(i,j+n,,g[i][j]);
}
addEdge(i+n,n+n+,,);
}
ll cost = ;
minCostMaxFlow(,n+n+,cost,n+n+);
cout<<cost<<endl;
init();
cost=;
for(int i=;i<=n;i++){
addEdge(,i,,);
for(int j=;j<=n;j++){
addEdge(i,j+n,,-g[i][j]);
}
addEdge(i+n,n+n+,,);
}
minCostMaxFlow(,n+n+,cost,n+n+);
cout<<-cost<<endl;
}

5. 3254 圆桌问题

最大流,源点到每个单位连人数,每个单位到每个桌子连1,每个桌子到汇点连人数。

 #include<bits/stdc++.h>
using namespace std;
#define N 425
#define INF 0x3f3f3f3f int e[N][N];
int pre[N]; //记录当前点的前驱。
int d[N]; //记录距离标号 i-t距离的下界。
int num[N]; //gap优化,每个距离下标下的节点编号有多少个,为0的话,说明s-t不连通
int SAP(int s,int t){
memset(pre,-,sizeof(pre));
memset(d,,sizeof(d));
memset(num,,sizeof(num));
num[]=t;
int v,u=pre[s]=s,flow=,aug=INF;
while(d[s]<t){ //else 残量网络中不存在s-t路。
//寻找可行弧
for(v=;v<=t;v++){
if(e[u][v]>&&d[u]==d[v]+){
break;
}
}
if(v<=t){
pre[v]=u;
u=v;
if(v==t){
aug=INF;
//寻找当前找到路径上的最大流
for(int i=v;i!=s;i=pre[i]){
if(aug>e[pre[i]][i]) aug=e[pre[i]][i];
}
flow+=aug;
//更新残留网络。
for(int i=v;i!=s;i=pre[i]){
e[pre[i]][i]-=aug;
e[i][pre[i]]+=aug;
}
u=s; //从源点开始继续搜。
}
}else{
//找不到可行弧
int minlevel=t;
//寻找与当前点连接的最小的距离标号。
for(v=;v<=t;v++){
if(e[u][v]>&&minlevel>d[v]){
minlevel=d[v];
}
}
num[d[u]]--; //当前标号的数目减一
if(!num[d[u]]) break; //出现断层。
d[u]=minlevel+;
num[d[u]]++;
u=pre[u];
}
}
return flow;
}
int n,m;
int a[],b[];
int main() {
ios::sync_with_stdio(false);
cin>>n>>m;
int sum = ;
for(int i=;i<=n;i++){
cin>>a[i];
sum+=a[i];
}
for(int i=;i<=m;i++){
cin>>b[i];
}
for(int i=;i<=n+;i++){
for(int j=;j<=m;j++){
e[i][j+n+]=;
}
}
for(int i=;i<=n+;i++){
e[][i] = a[i-];
}
for(int i=;i<=m;i++){
e[i+n+][n+m+]=b[i];
}
int flag = SAP(,n+m+)==sum;
cout<<flag<<endl;
if(flag){
for(int i=;i<=n+;i++){
for(int j=;j<=m;j++){
if(e[i][j+n+]==){
cout<<j<<' ';
}
}
cout<<endl;
}
}
}

6.2774 方格取数

很显然的最小割,用所有数的和减去最小割就是答案了吧,然后最小割等于最大流。

我们可以把点按照 (i+j) 的奇偶 分为两类,然后两类之间连边INF,源点到一类点连边权值,另一类到汇点连边权值。

 #include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
struct Edge{
int from,to,cap,flow;//容量流量
};
int n,m,s,t;//节点数,边数,源汇点
vector<Edge> edges;//边表
vector<int> G[];//G[i][j]表示结点i的第j条边在e数组中的序号
bool vis[];//BFS使用
int d[];//分层图
int cur[];//当前弧
void addEdge(int from,int to,int cap){
edges.push_back((Edge){from,to,cap,});
edges.push_back(Edge{to,from,,});
m = edges.size();
G[from].push_back(m-);
G[to].push_back(m-);
}
bool BFS(){
memset(vis,, sizeof(vis));
queue<int> Q;
Q.push(s);
d[s]=;
vis[s]=;
while (!Q.empty()){
int x = Q.front();
Q.pop();
for(int i=;i<G[x].size();i++){
Edge &e = edges[G[x][i]];
if(!vis[e.to]&&e.cap>e.flow){
vis[e.to]=;
d[e.to]=d[x]+;
Q.push(e.to);
}
}
}
return vis[t];//能否增广到
}
int DFS(int x,int a){
if(x==t||a==)
return a;
int flow = ,f;
for(int& i=cur[x];i<G[x].size();i++){//当前弧优化
Edge& e = edges[G[x][i]];
if(d[x]+==d[e.to]&&(f=DFS(e.to,min(a,e.cap-e.flow)))>){
e.flow+=f;
edges[G[x][i]^].flow-=f;
flow+=f;
a-=f;
if(a==)//??????炸点优化o.o
break;
}
}
return flow;
}
int maxflow(){
int flow = ;
while (BFS()){
memset(cur,, sizeof(cur));
flow+=DFS(s,INF);
}
return flow;
}
int M,N,g[][];
bool in(int x,int y){
return x>=&&x<=M&&y>=&&y<=N;
}
int main(){
ios::sync_with_stdio(false);
cin>>M>>N;
int sum = ;
for(int i=;i<=M;i++){
for(int j=;j<=N;j++){
cin>>g[i][j];
sum+=g[i][j];
}
}
for(int i=;i<=M;i++){
for(int j=;j<=N;j++){
if((i+j)&){
addEdge(,(i-)*N+j,g[i][j]);
if(in(i-,j))
addEdge((i-)*N+j,(i-)*N+j,INF);
if(in(i+,j))
addEdge((i-)*N+j,i*N+j,INF);
if(in(i,j-))
addEdge((i-)*N+j,(i-)*N+j-,INF);
if(in(i,j+))
addEdge((i-)*N+j,(i-)*N+j+,INF);
} else{
addEdge((i-)*N+j,N*M+,g[i][j]);
}
}
}
n=N*M+,s=,t=N*M+;
cout<<sum-maxflow()<<endl;
}

7. 2763 试题库问题

这道题非常的水啊,我刚才写了写一遍就过了。

最大流,建图请看代码qwq

 #include <bits/stdc++.h>
using namespace std;
const int MAXN = ;
const int MAXM = ;
const int INF = 0x3f3f3f3f;
struct Edge{
int to,next,cap,flow;
}edge[MAXM];
int tol;
int head[MAXN];
void init(){
tol = ;
memset(head,-, sizeof(head));
}
void addEdge(int u,int v,int w,int rw = ){
edge[tol].to=v;edge[tol].cap=w;edge[tol].flow=;
edge[tol].next=head[u];head[u]=tol++;
edge[tol].to=u;edge[tol].cap=rw;edge[tol].flow=;
edge[tol].next=head[v];head[v]=tol++;
}
int Q[MAXN];
int dep[MAXN],cur[MAXN],sta[MAXN];
bool bfs(int s,int t,int n){
int front = ,tail = ;
memset(dep,-, sizeof(dep[])*(n+));
dep[s]=;
Q[tail++] = s;
while (front<tail){
int u = Q[front++];
for(int i=head[u];i!=-;i=edge[i].next){
int v = edge[i].to;
if(edge[i].cap>edge[i].flow&&dep[v]==-){
dep[v]=dep[u]+;
if(v==t)return true;
Q[tail++] = v;
}
}
}
return false ;
}
int dinic(int s,int t,int n){
int maxflow = ;
while (bfs(s,t,n)){
for(int i=;i<n;i++)cur[i] = head[i];
int u = s,tail = ;
while (cur[s]!=-){
if(u==t){
int tp = INF;
for(int i=tail-;i>=;i--){
tp = min(tp,edge[sta[i]].cap-edge[sta[i]].flow);
}
maxflow +=tp;
for(int i=tail-;i>=;i--){
edge[sta[i]].flow+=tp;
edge[sta[i]^].flow-=tp;
if(edge[sta[i]].cap-edge[sta[i]].flow==)
tail = i;
}
u=edge[sta[tail]^].to;
}
else if(cur[u]!=-&&edge[cur[u]].cap>edge[cur[u]].flow&&dep[u]+==dep[edge[cur[u]].to]){
sta[tail++]=cur[u];
u = edge[cur[u]].to;
}
else{
while (u!=s&&cur[u]==-)
u = edge[sta[--tail]^].to;
cur[u] = edge[cur[u]].next;
}
}
}
return maxflow;
}
int k,n,a,b,sum;
int main(){
ios::sync_with_stdio(false);
init();
cin>>k>>n;
for(int i=;i<=k;i++){
cin>>a;
sum+=a;
addEdge(i+n,k+n+,a);
}
for(int i=;i<=n;i++){
addEdge(,i,);
cin>>a;
while (a--){
cin>>b;
//v[i].push_back(b);
addEdge(i,b+n,);
}
}
int ans = dinic(,k+n+,k+n+);
if(ans!=sum){
cout<<"No Solution!"<<endl;
} else{
for(int i=;i<=k;i++){
cout<<i<<": ";
int tmp = i+n;
for(int j=head[tmp];j!=-;j=edge[j].next){
if(edge[j^].flow==)
cout<<edge[j].to<<' ';
}
cout<<endl;
}
}
}

8. 2764 最小路径覆盖问题

拆点就行,然后跑二分图匹配&最大流,每匹配到一个就意味着有两个点可以连在一条边上吧,所以答案就是总的减去匹配数,详细的可以去看hzw的blog,顺便%hzw

 #include <bits/stdc++.h>
using namespace std;
int n,m,a,b;
const int MAXN= ;
int g[MAXN][MAXN];
int linker[MAXN],used[MAXN];
int vis[MAXN];
vector<int> ans;
bool dfs(int u){
for (int v = ;v<=*n;v++){
if(g[u][v]&&!used[v]) {
used[v] = true;
if (linker[v] == - || dfs(linker[v])) {
linker[v] = u;
return true;
}
}
}
return false;
}
int hungary(){
int res = ;
memset(linker,-, sizeof(linker));
for(int u=;u<=n;u++){
memset(used,, sizeof(used));
if (dfs(u))
res++;
}
return res;
}
int main(){
ios::sync_with_stdio(false);
cin>>n>>m;
while (m--){
cin>>a>>b;
g[a][b+n]=;
}
int res = hungary();
for(int i=*n;i>n;i--){
//cout<<linker[i]<<' ';
if(vis[i])
continue;
int tmp = i;
while (tmp!=n-){
ans.push_back(tmp-n);
tmp=linker[tmp]+n;
vis[tmp]=;
}
reverse(ans.begin(),ans.end());
for(int j=;j<ans.size();j++)
cout<<ans[j]<<' ';
cout<<endl;
ans.clear();
}
cout<<n-res<<endl;
}

9.牛客国庆day6A题(乱入

大水题,题解说的什么乱七八咋的(逃

一共n+m+2个点就可以,然后连边就是13579这样子。

 #include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = ;
const int MAXM = ;
const int INF = 0x3f3f3f3f;
struct Edge{
int to,next,cap,flow,cost;
}edge[MAXM];
int head[MAXN],tol;
int pre[MAXN],dis[MAXN];
bool vis[MAXN];
void init(){
tol = ;
memset(head,-, sizeof(head));
}
void addEdge(int u,int v,int cap,int cost){
edge[tol].to=v;
edge[tol].cap = cap;
edge[tol].cost = cost;
edge[tol].flow = ;
edge[tol].next = head[u];
head[u]=tol++;
edge[tol].to = u;
edge[tol].cap = ;
edge[tol].cost = -cost;
edge[tol].flow = ;
edge[tol].next = head[v];
head[v]=tol++;
}
bool spfa(int s,int t,int N){
queue<int> q;
for(int i=;i<N;i++){
dis[i]=INF;
vis[i] = false;
pre[i]=-;
}
dis[s]=;
vis[s]=true;
q.push(s);
while (!q.empty()){
int u = q.front();
q.pop();
vis[u] = false;
for(int i=head[u];i!=-;i=edge[i].next){
int v = edge[i].to;
if(edge[i].cap>edge[i].flow&&dis[v]>dis[u]+edge[i].cost){
dis[v]=dis[u]+edge[i].cost;
pre[v]=i;
if(!vis[v]){
vis[v]=true;
q.push(v);
}
}
}
}
if(pre[t]==-)return false;
return true;
}
ll minCostMaxFlow(int s,int t,ll &cost,int N){
int flow = ;
cost = ;
while (spfa(s,t,N)){
int Min = INF;
for(int i=pre[t];i!=-;i=pre[edge[i^].to]){
if(Min>edge[i].cap-edge[i].flow)
Min = edge[i].cap-edge[i].flow;
}
for(int i=pre[t];i!=-;i=pre[edge[i^].to]){
edge[i].flow+=Min;
edge[i^].flow-=Min;
cost+=1ll*edge[i].cost*Min;
}
flow+=Min;
}
return flow;
}
int n,m;
int main(){
ios::sync_with_stdio(false);
init();
cin>>n>>m;
int a,b;
for(int i=;i<=n;i++){
cin>>a>>b;
addEdge(i,a+n,,);
addEdge(i,b+n,,);
}
for(int i=;i<=n;i++){
addEdge(,i,,);
}
for(int i=n+;i<=n+m;i++){
for(int j=;j<=n;j++){
addEdge(i,n+m+,,*j-);
}
}
ll cost = ;
minCostMaxFlow(,n+m+,cost,n+m+);
cout<<cost<<endl;
}

唔然后剩下的全咕着,应该要等这个赛季结束之后,顺便我去的北京,祝自己rp++;

网络流24T的更多相关文章

  1. 网络流24T 太空飞行计划问题

    题目背景 题目描述 W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,…,Em},和进行这些实验需要使用的 ...

  2. plain framework 1 网络流 缓存数据详解

    网络流是什么?为什么网络流中需要存在缓存数据?为什么PF中要采用缓存网络数据的机制?带着这几个疑问,让我们好好详细的了解一下在网络数据交互中我们容易忽视以及薄弱的一块.该部分为PF现有的网络流模型,但 ...

  3. 网络流模板 NetworkFlow

    身边的小伙伴们都在愉快地刷网络流,我也来写一发模板好了. Network Flow - Maximum Flow Time Limit : 1 sec, Memory Limit : 65536 KB ...

  4. COGS732. [网络流24题] 试题库

    «问题描述:假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取m 道题组成试卷.并要求试卷包含指定类型的试题.试设计一个满足要求的组卷算法.«编程任务: ...

  5. ACM/ICPC 之 有流量上下界的网络流-Dinic(可做模板)(POJ2396)

    //有流量上下界的网络流 //Time:47Ms Memory:1788K #include<iostream> #include<cstring> #include<c ...

  6. BZOJ 3144 [Hnoi2013]切糕 ——网络流

    [题目分析] 网络流好题! 从割的方面来考虑问题往往会得到简化. 当割掉i,j,k时,必定附近的要割在k-D到k+D上. 所以只需要建两条inf的边来强制,如果割不掉强制范围内的时候,原来的边一定会换 ...

  7. bzoj3572又TM是网络流

    = =我承认我写网络流写疯了 = =我承认前面几篇博文都是扯淡,我写的是垃圾dinic(根本不叫dinic) = =我承认这道题我调了半天 = =我承认我这道题一开始是T的,后来换上真正的dinic才 ...

  8. hdu3549还是网络流

    最后一次训练模板(比较熟练了) 接下来训练网络流的建图 #include <cstdio> #define INF 2147483647 int n,m,ans,x,y,z,M,h,t,T ...

  9. 二分图&网络流&最小割等问题的总结

    二分图基础: 最大匹配:匈牙利算法 最小点覆盖=最大匹配 最小边覆盖=总节点数-最大匹配 最大独立集=点数-最大匹配 网络流: 技巧: 1.拆点为边,即一个点有限制,可将其转化为边 BZOJ1066, ...

随机推荐

  1. JSP解决:Attempt to clear a buffer that&#39;s already been flushed错误(jsp:forward标签跳转空白)

    [摘要:本日正在开辟过程当中发明一个题目:正在页里中应用了jsp:forward扔错Attempt to clear a buffer that's already been flushed!! 百思 ...

  2. Docker技术快速精通指南

    doctor专业网站:http://www.dockerinfo.net/ Docker中文文档 csdn 的docker专栏: Docker技术快速精通指南

  3. Thymeleaf-语法整理

    Thymeleaf其他案例看其他网站 http://www.cnblogs.com/hjwublog/p/5051732.html http://blog.csdn.net/u012706811/ar ...

  4. Linux:“awk”命令的妙用

    awk是一个强大的文本分析工具,简单来说awk就是把文件逐行读入,(空格,制表符)为默认分隔符将每行切片,切开的部分再进行各种分析处理. 0.基本用法 awk是一个强大的文本分析工具,简单来说awk就 ...

  5. ACC自适应巡航控制系统介绍

    本文是关于ACC自适应巡航控制系统的介绍,罗孚从个人视角出发,描述对ACC系统的理解,以及在一些使用场景下的思考. 什么是ACC? ACC系统是在定速巡航装置的基础上发展而来的,区别在于定速巡航只能限 ...

  6. [Linux] - CentOS运行DotNet Web程序

    文章说明 在Linux(CentOS)是运行C#的Web应用程序,这里使用及讲解的是Jexus服务器安装及配置.非ASP.net Core 安装步骤 一.下载及安装Mono yum install y ...

  7. 每天一个linux命令(15):tail命令

    1.命令简介 tail (tail) 用来显示档案的结尾(默认为10行)至标准输出中.若指定了多于一个文件,程序会在每段输出的开始添加相应文件名作为头.如果不指定文件或文件为"-" ...

  8. shell脚本启动语法错误syntax error near unexpected token '{

    执行shell脚本时失败,报语法错误,但脚本内容检查正常 原因为该脚本是在非Linux系统下编辑之后放到系统执行的,文件模式类型非Linux系统匹配的模式类型. 查看文件的模式类型 显示文件的模式类型 ...

  9. C#反射实现 C# 反射 判断类的延伸类型 使用代码生成工具Database2Sharp快速生成工作流模块控制器和视图代码 C# ADO.NET的SqlDataReader对象,判断是否包含指定字段 页面中添加锚点的几种方式 .net 简单实用Log4net(多个日志配置文件) C# 常用小点

    C#反射实现   一.反射概念: 1.概念: 反射,通俗的讲就是我们在只知道一个对象的内部而不了解内部结构的情况下,通过反射这个技术可以使我们明确这个对象的内部实现. 在.NET中,反射是重要的机制, ...

  10. VNC Viewer 设置屏幕分辨率

    1.第一种方法:使用geometry参数进行调整 vncserver -geometry 1280x1024即可,之后通过window下vnc连接后的ubuntu分辨率即为1280x1024了,注意这 ...