记录编号 17057 评测结果 AAAAAAAAAA
题目名称 K- 联赛 最终得分 100
用户昵称 Gravatar.Xmz 是否通过 通过
代码语言 C++ 运行时间 0.044 s
提交时间 2010-07-06 15:25:29 内存使用 0.74 MiB
显示代码纯文本
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <cstdlib>

using namespace std;
const int oo=200000000;

int w[40],yw[40],n,kmax,pn;
int a[40][40],ya[40][40];int lose[40][40];

struct edge
{
	int t,c;
	edge *op,*next;
}E[30000],*V[100];
int eh,S,T;

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()
{
	scanf("%d",&n);
	int t;
	for (int i=1;i<=n;i++)
	{
		scanf("%d%d",&yw[i],&t);
	}
	for (int i=1;i<=n;i++)
	for (int j=1;j<=n;j++)
	{
		scanf("%d",&ya[i][j]);
	}
}

void tanxin(int now)
{
	for (int i=1;i<=n;i++)
	{
		w[now]+=a[now][i];
		a[now][i]=0;
		a[i][now]=0;
	}

	for (int T=n;T>=1;T--)
	{
		int mini=T;
		for (int i=1;i<=n;i++)
		if (i!=now)
		{
				w[mini]+=a[mini][i];
				lose[i][mini]+=a[mini][i];
				a[mini][i]=0;
				a[i][mini]=0;
		}
	}
}

int d[100],vd[100];

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

bool tiaozheng(int now)
{
	int need=0,ans=0;
	eh=0;
	memset(V,0,sizeof(V));
	S=0;T=66;
	for (int i=1;i<=n;i++)
	{
		if (w[i]>w[now])
		{
			need+=w[i]-w[now];
			addedge(i,T,w[i]-w[now]);
		}
		if (w[i]<w[now])
		{
			addedge(S,i,w[now]-w[i]);
		}
	}
	for (int i=1;i<=n;i++)
	for (int j=1;j<=n;j++)
	if (lose[i][j])
	{
		addedge(i,j,lose[i][j]);
	}
	pn=n+2;
	vd[0]=pn;
	memset(d,0,sizeof(d));
	while (d[S]<pn)
	{
		ans+=dfs(S,oo);
	}
	if (ans==need) return true;
	return false;
}

int ans[100],ansh;

void solve()
{
	for (int i=1;i<=n;i++)
	{
		memcpy(w,yw,sizeof(yw));
		memcpy(a,ya,sizeof(ya));
		memset(lose,0,sizeof(lose));
		tanxin(i);
		if (tiaozheng(i)) ans[++ansh]=i;
	}
	for (int i=1;i<ansh;i++)
	{
		printf("%d ",ans[i]);
	}
	printf("%d\n",ans[ansh]);
}

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