POJ 3723 Conscription 并查集 + Kruskal

来源:互联网 发布:刀具长度补偿怎么编程 编辑:程序博客网 时间:2024/06/07 06:08
#include<iostream>#include<cstdio>#include<algorithm>using namespace std;#define MAX_N 20002#define MAX_E 50001struct edge{int u, v, cost;};int par[MAX_N];int Rank[MAX_N];edge es[MAX_E];int V, E;bool compare(const edge &e1, const edge &e2){return e1.cost<e2.cost;}void init(int N){for (int i = 0; i<N; i++){par[i] = i;Rank[i] = 0;}}int find(int x){if (par[x] == x)return x;elsereturn par[x]=find(par[x]);}void unite(int x, int y){x = find(x);y = find(y);if (x == y) return;if (Rank[x]>Rank[y])swap(x, y);par[x] = y;Rank[x]++;}bool same(int x, int y){x = find(x);y = find(y);return x == y;}int krus(){sort(es, es + E, compare);init(V);int ret = 0;for (int i = 0; i<E; i++){if (same(es[i].u, es[i].v) == false){ret += es[i].cost;unite(es[i].u, es[i].v);}}return ret;}int main(){int count;int N, M;scanf("%d", &count);for (int i = 0; i<count; i++){scanf("%d%d%d", &N, &M, &E);for (int j = 0; j<E; j++){int v, cost;scanf("%d%d%d", &es[j].u, &v, &cost);es[j].v = v + N;es[j].cost = -cost;}V = M + N;printf("%d\n", V * 10000 + krus());}return 0;}

0 0
原创粉丝点击