ISAP

跑的是比Dinic快辣。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<queue>
 6 #include<cstring>
 7 #define PAU putchar(‘ ‘)
 8 #define ENT putchar(‘\n‘)
 9 using namespace std;
10 const int maxn=10000+10,maxm=80000+10,inf=-1u>>1;
11 struct ISAP{
12     struct Tedge{int x,y,w,next;}adj[maxm];int ms,fch[maxn];
13     int gap[maxn],cur[maxn],d[maxn],sta[maxn],n,t,top;
14     void init(int n){
15         this->n=n;ms=0;t=1;top=0;
16         memset(fch,-1,sizeof(fch));
17         memset(d,-1,sizeof(d));
18         return;
19     }
20     void AddEdge(int w,int v,int u){
21         adj[ms]=(Tedge){u,v,w,fch[u]};fch[u]=ms++;
22         adj[ms]=(Tedge){v,u,0,fch[v]};fch[v]=ms++;
23         return;
24     }
25     void bfs(){
26         queue<int>Q;Q.push(n);d[n]=0;
27         while(!Q.empty()){
28             int u=Q.front();Q.pop();
29             for(int i=fch[u];i!=-1;i=adj[i].next){
30                 int v=adj[i].y;
31                 if(d[v]==-1) d[v]=d[u]+1,Q.push(v);
32             }
33         } return;
34     }
35     int MaxFlow(){
36         bfs();int k=t,i,flow=0;
37         for(i=1;i<=n;i++) cur[i]=fch[i],gap[d[i]]++;
38         while(d[t]<n){
39             if(k==n){
40                 int mi=inf,pos;
41                 for(int i=0;i<top;i++) if(mi>adj[sta[i]].w) mi=adj[sta[i]].w,pos=i;
42                 for(int i=0;i<top;i++) adj[sta[i]].w-=mi,adj[sta[i]^1].w+=mi;
43                 flow+=mi;top=pos;k=adj[sta[top]].x;
44             }
45             for(i=cur[k];i!=-1;i=adj[i].next){
46                 int v=adj[i].y;
47                 if(adj[i].w&&d[k]==d[v]+1){cur[k]=i;k=v;sta[top++]=i;break;}
48             }
49             if(i==-1){
50                 int lim=n;
51                 for(int i=fch[k];i!=-1;i=adj[i].next){
52                     int v=adj[i].y;
53                     if(adj[i].w&&d[v]<lim) lim=d[v],cur[k]=i;
54                 } if(--gap[d[k]]==0) break;
55                 d[k]=lim+1;gap[d[k]]++;
56                 if(t!=k) k=adj[sta[--top]].x;
57             }
58         } return flow;
59     }
60 }sol;
61 inline int read(){
62     int x=0,sig=1;char ch=getchar();
63     while(!isdigit(ch)){if(ch==‘-‘)sig=-1;ch=getchar();}
64     while(isdigit(ch))x=10*x+ch-‘0‘,ch=getchar();
65     return x*=sig;
66 }
67 inline void write(int x){
68     if(x==0){putchar(‘0‘);return;}if(x<0)putchar(‘-‘),x=-x;
69     int len=0,buf[15];while(x)buf[len++]=x%10,x/=10;
70     for(int i=len-1;i>=0;i--)putchar(buf[i]+‘0‘);return;
71 }
72 void init(){
73     int n=read(),m=read();sol.init(n);
74     for(int i=1;i<=m;i++) sol.AddEdge(read(),read(),read());
75     write(sol.MaxFlow());
76     return;
77 }
78 void work(){
79     return;
80 }
81 void print(){
82     return;
83 }
84 int main(){init();work();print();return 0;}

搜索

复制

时间: 2024-10-15 08:12:39

ISAP的相关文章

【CodeVS 1993】草地排水 isap模板题

开始网络流的学习,更新一下isap的模板 #include<cstdio> #include<cstring> #include<algorithm> #define read(x) x=getint() using namespace std; const int N = 403; int getint() { int k = 0, fh = 1; char c = getchar(); for(; c < '0' || c > '9'; c = getc

ISAP 模板

1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <queue> 5 6 using namespace std; 7 const int INF=2147483647; 8 const int maxn=210,maxm=410; 9 int cnt,fir[maxn],nxt[maxm],cap[maxm],to[maxm],dis[maxn],gap[ma

最大流isap模板

isap+bfs初始化+栈优化,点的编号从0开始: 1 const int MAXN = 100010; 2 const int MAXM = 400010; 3 const int INF = 0x3f3f3f3f; 4 struct Edge 5 { 6 int to, next, cap, flow; 7 }edge[MAXM]; 8 int tol; 9 int head[MAXN]; 10 int gap[MAXN], dep[MAXN], cur[MAXN]; 11 void ini

upcoj2673 It Can Be Arranged(isap)

题意: 有N节课,每节课有起止时间和学生数 然后给你M是每个教室容纳的学生数 然后给你n*n的矩阵表示上完第i节课然后上第j节课需要a[i][j]的时间调整 第i节课结束时间加上调整时间要严格小于第j节课的开始时间 问你最少需要多少个教室 思路: 很简单的一个最大流 每节课分为两个节点,0为超级源点,2*n+1为超级汇点 先算出每节课需要的教室数,加到all里 然后从0到1-n加一个流量为教室数的边 从n+1——2*n到2*n+1加一个流量为教室数的边 然后将满足条件的i和j课程,从i到j+n连

hihocoder 1158 质数相关 (二分图最大独立集 最大流ISAP求解)

#1158 : 质数相关 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 两个数a和 b (a<b)被称为质数相关,是指a × p = b,这里p是一个质数.一个集合S被称为质数相关,是指S中存在两个质数相关的数,否则称S为质数无关.如{2, 8, 17}质数无关,但{2, 8, 16}, {3, 6}质数相关.现在给定一个集合S,问S的所有质数无关子集中,最大的子集的大小. 输入 第一行为一个数T,为数据组数.之后每组数据包含两行. 第一行为N,为集合S的大小.第二

HDUOJ--4888--Redraw Beautiful Drawings【isap】网络流+判环

链接:http://acm.hdu.edu.cn/showproblem.php?pid=4888 题意:一个矩阵,限定每行行和.列和,每个格子数字不超过k,问矩阵是否存在,如存在判断有单解还是多解. 思路:之前多校的题目,那时候还不会网络流,现在A掉了,矩阵的建图模型,判断网络流是否可行只要判断最大流是否等于总行和或总列和即可,判环是看的别人的解题报告,方法是使用dfs查找残余网络中是否有还存在容量的弧形成了环,如果有,说明可以通过这个环改变容量网络内部的增广路方式,而源汇的流量是不会变的,就

HDU 3572 Task Schedule(ISAP)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3572 题意:m台机器,需要做n个任务.第i个任务,你需要使用机器Pi天,且这个任务要在[Si  ,  Ei]区间内完成才有效.对于一个任务,只能由一个机器来完成,一个机器同一时间只能做一个任务.当然,一个任务可以分成几段不连续的时间来完成.问,能否做完全部任务. 题意很清晰,也就是判断是否是满流. 对于网络流问题,模板大家都有,关键在于如何建图(详见资料) 思路:今天问了龙哥,对建图有了一定的了解,

POJ 1459 Power Network(ISAP 裸最大流)

题目链接:http://poj.org/problem?id=1459 注意输入格式就行,还是ISAP #include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> #include <queue> #include <algorithm> const int N = 210; const int maxn = 300; const int ma

UVALive--6571--It Can Be Arranged【拆点+isap】最小割

链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4582 题意:有n门课程,每个课程有个开始时间和结束时间,和参加人数,现要租借教室来上课.再告诉你一个矩阵,a[i][j]表示第j门课如果在第i门课后使用第i门课的教室,需要a[i][j]的时间来打扫,i的结束时间+a[i][j]必须严格小于j的开始时间.问最少需要借多少