HDU 4280 Island Transport(网络流,SAP)

解题思路:

建模很简单,不过以前一直用dinic,,而这个题目数据偏大,用dinic超时了,据说没有可以卡住SAP的网络流,于是搞到了一套SAP的模版,过了,保存一下模版。

#include <iostream>#include <cstring>#include <cstdio>#include <cmath>#include <cstdlib>#include <vector>#include <queue>#include <stack>#include <map>#include <set>#pragma comment(linker, "/STACK:1024000000,1024000000")#define LL long long using namespace std;const int MAXN=100010;//点数的最大值const int MAXM=400010;//边数的最大值const int INF=0x3f3f3f3f;struct Node{int from,to,next;int cap;}edge[MAXM];int tol;int head[MAXN];int dep[MAXN];int gap[MAXN];//gap[x]=y :说明残留网络中dep[i]==x的个数为yint n;//n是总的点的个数,包括源点和汇点void init(){tol=0;memset(head,-1,sizeof(head));}void AddEdge(int u,int v,int w){edge[tol].from=u;edge[tol].to=v;edge[tol].cap=w;edge[tol].next=head[u];head[u]=tol++;edge[tol].from=v;edge[tol].to=u;edge[tol].cap=0;edge[tol].next=head[v];head[v]=tol++;}void BFS(int start,int end){memset(dep,-1,sizeof(dep));memset(gap,0,sizeof(gap));gap[0]=1;int que[MAXN];int front,rear;front=rear=0;dep[end]=0;que[rear++]=end;while(front!=rear){int u=que[front++];if(front==MAXN)front=0;for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].to;if(dep[v]!=-1)continue;que[rear++]=v;if(rear==MAXN)rear=0;dep[v]=dep[u]+1;++gap[dep[v]];}}}int SAP(int start,int end){int res=0;BFS(start,end);int cur[MAXN];int S[MAXN];int top=0;memcpy(cur,head,sizeof(head));int u=start;int i;while(dep[start]<n){if(u==end){int temp=INF;int inser;for(i=0;i<top;i++)if(temp>edge[S[i]].cap){temp=edge[S[i]].cap;inser=i;}for(i=0;i<top;i++){edge[S[i]].cap-=temp;edge[S[i]^1].cap+=temp;}res+=temp;top=inser;u=edge[S[top]].from;}if(u!=end&&gap[dep[u]-1]==0)//出现断层,无增广路break;for(i=cur[u];i!=-1;i=edge[i].next)if(edge[i].cap!=0&&dep[u]==dep[edge[i].to]+1)break;if(i!=-1){cur[u]=i;S[top++]=i;u=edge[i].to;}else{int min=n;for(i=head[u];i!=-1;i=edge[i].next){if(edge[i].cap==0)continue;if(min>dep[edge[i].to]){min=dep[edge[i].to];cur[u]=i;}}–gap[dep[u]];dep[u]=min+1;++gap[dep[u]];if(u!=start)u=edge[S[–top]].from;}}return res;}int main(){int T,N,M;scanf("%d", &T);while(T–){scanf("%d%d", &N, &M);int Min = 100010;int Max = -100010;int u,v,w;n = N;init();int x, y;int s,t;for(int i=1;i<=N;i++){scanf("%d%d", &x,&y);if(x < Min){Min = x;s = i;}if(x > Max){Max = x;t = i;}}for(int i=1;i<=M;i++){scanf("%d%d%d", &u,&v,&w);AddEdge(u,v,w);AddEdge(v,u,w);}printf("%d\n", SAP(s,t));}return 0;}

别人失去了信心,他却下决心实现自己的目标。

HDU 4280 Island Transport(网络流,SAP)

相关文章:

你感兴趣的文章:

标签云: