[BZOJ3714][PA2014]Kuglarz

bzoj

sol

显然你要知道每个位置下球的情况就要知道每个\(sum_i-sum_{i-1}\)吧。

其实一个询问\(i,j\)就是告诉你\(sum_j-sum_{i-1}\)的奇偶性,那么此时\(sum_j\)\(sum_{i-1}\)这两个变量就相互关联了吧。

那么实际上就是要你使用最小的代价,把\(sum_1...sum_n\)\(n\)个变量全都联系在一起。

模型转化为最小生成树。
\(Prim\)即可。

code

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define ll long long
int gi()
{
	int x=0,w=1;char ch=getchar();
	while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
	if (ch=='-') w=0,ch=getchar();
	while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
	return w?x:-x;
}
const int N = 2e3+5;
int n,c[N][N],dis[N],vis[N];
ll ans;
int main()
{
	n=gi()+1;
	for (int i=1;i<n;++i)
		for (int j=i+1;j<=n;++j)
			c[i][j]=c[j][i]=gi();
	memset(dis,63,sizeof(dis));dis[1]=0;
	for (int t=1;t<=n;++t)
	{
		int p=0;
		for (int i=1;i<=n;++i) if (!vis[i]) p=dis[i]<dis[p]?i:p;
		vis[p]=1;ans+=dis[p];
		for (int i=1;i<=n;++i) if (!vis[i]) dis[i]=min(dis[i],c[p][i]);
	}
	printf("%lld\n",ans);return 0;
}
posted @ 2018-03-28 14:08  租酥雨  阅读(153)  评论(0编辑  收藏  举报