比赛 20120708 评测结果 AATTTTTTTT
题目名称 最小最大生成树 最终得分 20
用户昵称 CC 运行时间 8.001 s
代码语言 C++ 内存使用 0.29 MiB
提交时间 2012-07-08 11:30:51
显示代码纯文本
#include <cstdio>
#include <algorithm>
struct bian {
	int x,y,v,index;
	bool av;
}d[100];
int n,m,tot,P,Q,R;
int fa[100];
int find(int u) {
	if (fa[u] == u) return fa[u];
	else return fa[u] = find(fa[u]);
}
bool cmp(bian a,bian b) {
	return a.v < b.v;
}
bool pan() {
	for (int i = 1;i <= n;i++) fa[i] = i;
	fa[P] = Q;
	int num = 1,smallsum = R,bigsum = R,real = 0;
	for (int i = 1;i <= m && num < n - 1;i++) 
		if (d[i].av && d[i].index != m) {
			int f1 = find(d[i].x),f2 = find(d[i].y);
			if (f1 != f2) {
				fa[f1] = f2;
				smallsum += d[i].v;
				num++;
			}
		}
	for (int i = 1;i <= n;i++) fa[i] = i; num = 0;
	for (int i = 1;i <= m && num < n - 1;i++)
		if (d[i].av) {
			int f1 = find(d[i].x),f2 = find(d[i].y);
			if (f1 != f2) {
				fa[f1] = f2;
				real += d[i].v;
				num++;
			}
		}
	if (real != smallsum) return 0;
	for (int i = 1;i <= n;i++) fa[i] = i; num = 1;
	fa[P] = Q;
	for (int i = m;i >= 1 && num < n - 1;i--) 
		if (d[i].av && d[i].index != m) {
			int f1 = find(d[i].x),f2 = find(d[i].y);
			if (f1 != f2) {
				fa[f1] = f2;
				bigsum += d[i].v;
				num++;
			}
		}
	for (int i = 1;i <= n;i++) fa[i] = i; num = 0;real = 0;
	for (int i = m;i >= 1 && num < n - 1;i--)
		if (d[i].av) {
			int f1 = find(d[i].x),f2 = find(d[i].y);
			if (f1 != f2) {
				fa[f1] = f2;
				real += d[i].v;
				num++;
			}
		}
	if (real != bigsum) return 0;
	return 1;
}
void dfs(int u) {
	if (u > tot) {
		if (pan()) {
			printf("%d\n", tot);
			exit(0);
		}
	} else {
		for (int i = 1;i <= m;i++) 
			if (d[i].av && d[i].index != m) {
				d[i].av = 0;
				dfs(u + 1);
				d[i].av = 1;
			}
	}
}
	

int main() {
	freopen("mstmn.in","r",stdin);
	freopen("mstmn.out","w",stdout);
	scanf("%d%d", &n, &m);
	for (int i = 1;i <= m;i++) {
		scanf("%d%d%d", &d[i].x, &d[i].y, &d[i].v);
		d[i].av = 1;d[i].index = i;
	}
	scanf("%d%d%d", &P, &Q, &R);
	d[++m].x = P;d[m].y = Q;d[m].v = R;d[m].av = 1;d[m].index = m;
	std::sort(d + 1,d + m + 1,cmp);
	tot = -1;
	while (true) {
		tot++;
		dfs(1);
	}
	return 0;
}