比赛 |
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;
}