544 - Heavy Cargo

来源:互联网 发布:elasticsearch5 linux 编辑:程序博客网 时间:2024/05/21 11:27

最大生成树

#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>#include <map>using namespace std;const int maxn = 100 + 7;const int maxm = 19900 + 7;const int INF = ~0U >> 1;int n, m, kase = 0;int p[maxn];struct node {    int u, v, val;    bool operator<(const node&r) const {        return val > r.val;    }}str[maxm];map<string, int> ma;int Find(int x) { return p[x] == x ? x : p[x] = Find(p[x]); }int main() {    while(scanf("%d%d", &n, &m) != EOF && n && m) {        ma.clear();        for(int i = 0; i <= n; ++i) p[i] = i;        char s1[100] = {0}, s2[100] = {0};        int val, k = 0;        for(int i = 0; i < m; ++i) {            scanf("%s%s%d", s1, s2, &val);            string a(s1), b(s2);            if(ma.count(a) == 0) ma[a] = k++;            if(ma.count(b) == 0) ma[b] = k++;            str[i] = (node){ma[a], ma[b], val};        }        scanf("%s%s", s1, s2);        string a(s1), b(s2);        int u = ma[a], v = ma[b];        sort(str, str + m);        int ans = INF;        for(int i = 0; i < m; ++i) {            node e = str[i];            int x = Find(e.u), y = Find(e.v);            if(x != y) {                p[x] = y;                ans = min(ans, e.val);            }            x = Find(u), y = Find(v);            if(x == y) break;        }        printf("Scenario #%d\n", ++kase);        printf("%d tons\n\n", ans);    }    return 0;}


0 0
原创粉丝点击