记录编号 26975 评测结果 AAAAAAAAAA
题目名称 朦胧之旅 最终得分 100
用户昵称 Gravatar.Xmz 是否通过 通过
代码语言 C++ 运行时间 0.029 s
提交时间 2011-07-30 14:55:46 内存使用 1.91 MiB
显示代码纯文本
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <cstdlib>

using namespace std;
int n,m,S,T,pn;
int d[10001],vd[10001];
bool y[5001];

struct edge
{
	int t,c;
	edge *next,*op;
}E[100001],*V[10001];
int eh;
inline void addedge(int a,int b,int c)
{
	E[++eh].next=V[a];  V[a]=E+eh;  V[a]->t=b;  V[a]->c=c;
	E[++eh].next=V[b];  V[b]=E+eh;  V[b]->t=a;  V[b]->c=0;
	V[a]->op=V[b];  V[b]->op=V[a];
}
void init()
{
	int s=0,a,b,c;S=0;T=10000;
	d[S]=3;
	scanf("%d%d%d",&n,&m,&s);
	for (;s;--s)
	{
		scanf("%d%d%d",&a,&b,&c);
		if (!y[a]) {d[a]=2;vd[2]++;addedge(S,a,1);}
		if (!y[b]) {d[b]=1;vd[1]++;addedge(b,T,1);}
		y[a]=y[b]=true;
		if (c!=0) addedge(a,b,1);
	}
}

int dfs(int u,int flow)
{
	if (u==T) return flow;
	int now=0;
	for (edge *e=V[u];e;e=e->next)
	if (e->c && d[e->t]+1==d[u])
	{
		int t=dfs(e->t,min(e->c,flow-now));
		if (t)
		{
			e->c -= t;
			e->op->c += t;
			now += t;
			if (flow==now) return now;
		}
	}
	if (d[S]>=pn) return now;
	if (--vd[d[u]]==0) d[S]=pn;
	vd[++d[u]]++;
	return now;
}

void solve()
{
	int flow=n;pn=n+2;
	vd[0]=vd[3]=1;
	while (d[S]<pn)
	{
		flow-=dfs(S,flow);
	}
	printf("0 %d\n",flow);
}

int main()
{
	freopen("lovetravel.in","r",stdin);
	freopen("lovetravel.out","w",stdout);
	init();
	solve();
	return 0;
}