记录编号 53518 评测结果 AAWATWTAAA
题目名称 塔防游戏 最终得分 60
用户昵称 GravatarCitron酱 是否通过 未通过
代码语言 C++ 运行时间 2.585 s
提交时间 2013-02-28 17:28:37 内存使用 7.95 MiB
显示代码纯文本
#include <cstdio>
#include <climits>

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

const int MAXn=1000;

struct que
{
	int x;
	que *next;
};

int n, s, t;
int map1[MAXn][MAXn]={{0}}, map2[MAXn][MAXn]={{0}};
long ds[MAXn], dt[MAXn];
int v[MAXn]={0}, h[MAXn+1]={0};
bool flag=true;
int ans=0;

void Input();
void Spfa(long*, const int&);
void Getmap2();
int Dfs(const int&, const int&);
inline int Min(const int&, const int&);
void Sap();
void Output();

int main()
{
	Input();
	Spfa(ds,s);
	Spfa(dt,t);
	Getmap2();
	Sap();
	Output();
	return 0;
}

void Input()
{
	long m;
	int a, b, c;
	freopen(I_F,"r",stdin);
	for (scanf("%d%ld%d%d",&n,&m,&s,&t); m>0; --m)
	{
		scanf("%d%d%d",&a,&b,&c);
		--a, --b;
		map1[a][b]=map1[b][a]=c;
	}
	--s, --t;
}

void Spfa(long *s, const int &x)
{
	for (int i=0; i<n; ++i)
		s[i]=-1;
	s[x]=0;
	bool f[MAXn]={false};
	f[x]=true;
	que *head, *tail, *temp;
	head=new que;
	head->x=x;
	head->next=NULL;
	tail=head;
	
	while (head!=NULL)
	{
		for (int i=0; i<n; ++i)
			if (map1[head->x][i]>0 && (s[head->x]+map1[head->x][i]<s[i] || s[i]==-1))
			{
				s[i]=s[head->x]+map1[head->x][i];
				if (!f[i])
				{
					tail->next=new que;
					tail=tail->next;
					tail->x=i;
					tail->next=NULL;
				}
			}
		temp=head;
		head=head->next;
		delete temp;
	}
}

void Getmap2()
{
	for (int i=0; i<n; ++i)
		for (int j=0; j<n; ++j)
			if (ds[j]+dt[i]-map1[i][j]==ds[t])
				map2[i][j]=map2[j][i]=1;
}

int Dfs(const int &x, const int &s)
{
	if (x==t)
		return s;
	int f=0, t, minv=INT_MAX;
	for (int i=0; i<n && f<s; ++i)
		if (map2[x][i]>0)
		{
			minv=Min(minv,v[i]);
			if (v[i]==v[x]-1)
			{
				t=Dfs(i,Min(map2[x][i],s-f));
				f+=t;
				map2[x][i]-=t;
				map2[i][x]+=t;
			}
		}
//	if (--h[v[x]++]==0)
//		flag=false;
	if (f==0)
	{
		if (--h[v[x]]==0) 
			flag=false;
		v[x]=minv+1;
	}
	return f;
}

inline int Min(const int &a, const int &b)
{
	return (a<b)?a:b;
}

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

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