算法复习——网络流模板(ssoj)

题目:

题目描述

有 n(0<n<=1000)个点,m(0<m<=1000)条边,每条边有个流量 h(0<=h<35000),求从点 start 到点 end 的最大流。

输入格式

第一行:4 个整数,分别是 n,m,start,end 。
接下来有 m 行,每行四个三个整数 a,b,h,分别表示 a 到 b,流量为 h 的一条边。

输出格式

输出从点 start 到点 end 的最大流。

样例数据 1

输入  [复制]

7 14 1 7 
1 2 5 
1 3 6 
1 4 5 
2 3 2 
2 5 3 
3 2 2 
3 4 3 
3 5 3 
3 6 7 
4 6 5 
5 6 1 
6 5 1 
5 7 8 
6 7 7

输出

14

备注

【样例图示】

【数据范围】

0<n,m<=1000;h<=35000

方法:

网络流基础模板

代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
using namespace std;
queue<int>que;
const int N=100005;
const int inf=1e+9;
int first[N],go[N*2],next[N*2],rest[N*2],lev[N],tot=1;
int n,m,src,des,ans;

inline bool bfs()
{
  for(int i=1;i<=n;i++)  lev[i]=-1;
  int tail,head,que[N];
  que[tail=1]=src;
  lev[src]=0;
  for(head=1;head<=tail;head++)
  {
    int u=que[head],v;
    for(int e=first[u];e;e=next[e])
    {
      if(rest[e]&&lev[v=go[e]]==-1)
      {
        lev[v]=lev[u]+1;
        que[++tail]=v;
        if(v==des)
          return true;
      }
    }
  }
  return false;
}

inline int dinic(int u,int flow)
{
  if(u==des)
    return flow;
  int res=0,temp,v;
  for(int e=first[u];e;e=next[e])
  {
    if(rest[e]&&lev[v=go[e]]>lev[u])
    {
      temp=dinic(v,min(rest[e],flow-res));
      if(temp)
      {
        res+=temp;
        rest[e]-=temp,rest[e^1]+=temp;
        if(res==flow)  break;
      }
    }
  }
  if(res!=flow)  lev[u]=-1;
  return res;
}

inline void comb(int u,int v,int w)
{
  next[++tot]=first[u],first[u]=tot,rest[tot]=w,go[tot]=v;
  next[++tot]=first[v],first[v]=tot,rest[tot]=0,go[tot]=u;
}

inline void maxflow()
{
  while(bfs())
    ans+=dinic(src,inf);
}

int main()
{
  //freopen("a.in","r",stdin);
  //freopen("a.out","w",stdout);
  scanf("%d%d%d%d",&n,&m,&src,&des);
  int u,v,w;
  for(int i=1;i<=m;i++)
  {
    scanf("%d%d%d",&u,&v,&w);
    comb(u,v,w);
  }
  maxflow();
  cout<<ans<<endl;
  return 0;
}
时间: 2024-11-05 09:30:51

算法复习——网络流模板(ssoj)的相关文章

算法复习——LCA模板(POJ1330)

题目: Description A rooted tree is a well-known data structure in computer science and engineering. An example is shown below:  In the figure, each node is labeled with an integer from {1, 2,...,16}. Node 8 is the root of the tree. Node x is an ancesto

算法复习计划

写在前面 随着四月的到来, 离省选越来越近了. 从NOIP到现在, 学到了很多很多东西, 有的学的比较深入, 有的只是略知一二 从明天开始, 进行针对省选的算法复习计划. 省选前完成. 重点是对算法的理解和应用, 还会注重模板习惯的养成 计划内容 1. 数据结构 一直觉得我数据结构学的还可以, 不过列出来发现会的也没多少. 少就少吧, 省选够用就行... 线段树 树状数组 并查集 哈希表 STL treap splay 树链剖分 主席树(可忽略) 字符串(KMP, 后缀数组) 2. 图论 掌握经

C语言排序算法复习

排序算法有很多种,这里在复习和分析的基础上,做一个自己的总结: 首先要知道有哪些排序算法,google一下,有云C语言7大经典排序算法(也有8大).主要包括冒泡排序,快速排序,选择排序,插入排序,希尔排序,归并排序,堆排序,8大的还有基数排序.各有各的版本,代码写法也各不相同.所以这里以整理思路为先,代码只是作为自己的一个备份. 搞清楚的概念:稳定排序和不稳定排序,就看序列中两个值相等的数,排完序之后的相对位置是否改变,如果改变了就不稳定. 内部排序和外部排序,只用到内存即可完成排序的就叫内部排

摘:数据结构各种算法实现(C++模板)

目  录 1.顺序表. 1 Seqlist.h 1 Test.cpp 6 2.单链表. 8 ListNode.h 8 SingleList.h 10 test.cpp 20 3.双向链表. 22 NodeList.h 22 DoubleList.h 24 Test.cpp 34 4.循环链表. 36 ListNode.h 36 CircularList.h 37 Test.cpp 47 5.顺序栈. 49 SeqStack.h 49 Test.cpp 54 6.链式栈. 55 StackNode

Kuangbin网络流模板

Kuangbin网络流模板. const int maxn=20010; const int maxm=200010; const double INF=1e20; const double eps=1e-8; struct Edge{ int to,next; double cap,flow; }edge[maxm],tmpG[maxm]; int n,tot,toth,totv; int head[maxn],tmph[maxn]; int gap[maxn],dep[maxn],cur[m

POJ 2135 Farm Tour (dinic算法,网络流)

构图方法: 注意题目中的边为无向边.新建源点s 和 汇点t 每两条道路连一条容量为1,费用为w的边.s到1连一条容量为1,费用为0 的边,n到 t 连一条容量为1,费用为0 的边,求最大流. #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <algorithm> #include <queue> #include

排序算法复习

排序算法复习 作者:vpoet mails:[email protected] 注:转载请注明出处 #include <iostream> #include <windows.h> using namespace std; void Bubble_Sort(int UnSort[],int length); void Select_Sort(int UnSort[],int length); void Insert_Sort(int UnSort[],int length); vo

HDU 4280 Island Transport(网络流模板)

转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4280 Problem Description In the vast waters far far away, there are many islands. People are living on the islands, and all the transport among the islands relies

一般排序算法总结与模板

一般排序算法总结与模板 主要包括冒泡.插入.合并排序和两种二分查找的实现. 冒泡排序: 插入排序: 合并排序: #include <stdio.h> #include <stdlib.h> #include <errno.h> int a[]={223, 34, 23, 2, 21, 55, 87, 533 , 213, 111}; //int a[]={2, 21, 23, 34, 55, 87, 111, 213, 223, 533}; //int a[]={533