September Cook-Off 2012 COALSCAM : Coal Scam
問題概要
辺が与えられる。辺にはコストとAまたはBの属性がある。全域木をつくって、Bに属するコストを最大化し、そのなかで全コストの和を最小化したい。それぞれの値を求める問題。
解法
ただの最小全域木。
acceptされたコード
const int MAX_M = 40000; int N, M1, M2; pair< pair<int64,int64>, pair<int, int> > es[MAX_M]; void init() { scanf("%d%d%d", &N, &M1, &M2); for (int i = 0; i < M1; ++i) { int x, y, z; scanf("%d%d%d", &x, &y, &z); es[i] = make_pair(make_pair(0, z), make_pair(x, y) ); } for (int i = 0; i < M2; ++i) { int x, y, z; scanf("%d%d%d", &x, &y, &z); es[i+M1] = make_pair(make_pair(-z, z), make_pair(x, y)); } } void solve() { int cnt = 0; uf.init(N); sort(es, es + M1 + M2); int64 ans1 = 0, ans2 = 0; for (int i = 0; i < M1 + M2; ++i) { int x = es[i].second.first, y = es[i].second.second; if (!uf.isSame(x, y)) { ++cnt; uf.merge(x, y); ans1 -= es[i].first.first; ans2 += es[i].first.second; } } if (cnt == N - 1) { printf("%lld %lld\n", ans1, ans2); } else { puts("Impossible"); } }