1.题面
http://acm.hdu.edu.cn/showproblem.php?pid=4280
2.题意
给你网络,让你求最大流,数据有点大,需要比较靠谱的模板
3.思路
裸题,但是把我自己写的dinic干掉了
4.代码
/* 最大流模板 dinic算法 */ #include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> using namespace std; const int INF=0x3f3f3f3f; const int MAXN=100 + 100000;//点数的最大值 const int MAXM=100 + 200000;//边数的最大值 struct Node { int from,to,next; int cap; }edge[MAXM]; int tol; int dep[MAXN];//dep为点的层次 int head[MAXN]; int 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=w; edge[tol].next=head[v]; head[v]=tol++; } int BFS(int start,int end) { int que[MAXN]; int front,rear; front=rear=0; memset(dep,-1,sizeof(dep)); que[rear++]=start; dep[start]=0; 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(edge[i].cap>0&&dep[v]==-1) { dep[v]=dep[u]+1; que[rear++]=v; if(rear>=MAXN)rear=0; if(v==end)return 1; } } } return 0; } int dinic(int start,int end) { int res=0; int top; int stack[MAXN];//stack为栈,存储当前增广路 int cur[MAXN];//存储当前点的后继 while(BFS(start,end)) { memcpy(cur,head,sizeof(head)); int u=start; top=0; while(1) { if(u==end) { int min=INF; int loc; for(int i=0;i<top;i++) if(min>edge[stack[i]].cap) { min=edge[stack[i]].cap; loc=i; } for(int i=0;i<top;i++) { edge[stack[i]].cap-=min; edge[stack[i]^1].cap+=min; } res+=min; top=loc; u=edge[stack[top]].from; } for(int i=cur[u];i!=-1;cur[u]=i=edge[i].next) if(edge[i].cap!=0&&dep[u]+1==dep[edge[i].to]) break; if(cur[u]!=-1) { stack[top++]=cur[u]; u=edge[cur[u]].to; } else { if(top==0)break; dep[u]=-1; u=edge[stack[--top]].from; } } } return res; } typedef pair<int, int> pir; int main() { /*std::ios::sync_with_stdio(false);cin.tie(0);*/ int T; scanf("%d", &T); while (T--){ init(); int n, m; scanf("%d%d", &n, &m); pir ss(INF, 0), tt(-INF, n), tmp; //# cout << "n m = " << n << " " << m<< endl; for (int i = 1; i <= n; i++){ scanf("%d%d", &tmp.first, &tmp.second); tmp.second = i; ss = min(tmp, ss); tt = max(tmp, tt); } int s = ss.second, t = tt.second; while (m--){ int a, b, c; scanf("%d%d%d", &a, &b, &c); addedge(a, b, c); //# addedge(b, a, c); } //# cout << "s t " << s << " " << t << endl; int ans = dinic(s, t); printf("%d\n", ans); }/**/ return 0; }