HDU - 4280 Island Transport

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;
}


猜你喜欢

转载自blog.csdn.net/sinat_29278271/article/details/52729090