比赛 20120708 评测结果 WAWWWTTATT
题目名称 最小最大生成树 最终得分 20
用户昵称 Citron酱 运行时间 4.089 s
代码语言 C++ 内存使用 6.62 MiB
提交时间 2012-07-08 09:19:58
显示代码纯文本
#include <cstdio>
#include <climits>

#define I_F "mstmn.in"
#define O_F "mstmn.out"

const long MAXm=200000*2+1;
const int MAXn=20000;

struct edge
{
	int x;
	short c;
	edge *op, *next;
};

edge pool[MAXm];
edge *ph=pool;
edge *map[MAXn]={NULL};
int n, s, t;
int h[MAXn]={0}, v[MAXn]={0};
bool flag=true;
long ans;

void Input();
long Dfs(const int&, const long&);
void Sap();
void Output();

int main()
{
	Input();
	Sap();
	Output();
	return 0;
}

void Input()
{
	long m;
	int a, b;
	edge *temp;
	freopen(I_F,"r",stdin);
	for (scanf("%d%ld",&n,&m); m>0; --m)
	{
		scanf("%d%d%*d",&a,&b);
		--a, --b;
		temp=map[a];
		map[a]=ph++;
		map[a]->x=b;
		map[a]->c=1;
		map[a]->next=temp;
		temp=map[b];
		map[b]=ph++;
		map[b]->x=a;
		map[b]->c=1;
		map[b]->next=temp;
		map[a]->op=map[b];
		map[b]->op=map[a];
	}
	scanf("%d%d%*d",&s,&t);
	--s, --t;
}

long Dfs(const int &x, const long &s)
{
	if (x==t)
		return s;
	long f=s, now;
	for (edge *i=map[x]; i!=NULL && flag && f>0; i=i->next)
		if (i->c>0 && h[i->x]==h[x]-1)
		{
			now=Dfs(i->x,(f<i->c)?f:i->c);
			f-=now;
			i->c-=now;
			i->op->c+=now;
		}
	if (--v[h[x]++]==0)
		flag=false;
	return s-f;
}

void Sap()
{
	v[0]=n;
	while (h[s]<n && flag)
		ans+=Dfs(s,LONG_MAX/2);
}

void Output()
{
	freopen(O_F,"w",stdout);
	printf("%ld\n",ans);
}