【POJ 3723 】Conscription(最小生成树)

include

include

include

include

include

include

include

include

include

include

include

include

include

#define IOS \

ios_base::sync_with_stdio(0); \

cin.tie(0);

define Mod 1000000007

define eps 1e -6

define ll long long

define INF 0x3f3f3f3f

define MEM (x, y) memset(x, y, sizeof(x))

define Maxn 1000000 + 10

using namespace std;

int N, M, R;

int x[Maxn], y[Maxn], d[Maxn];//男孩 女孩 关系度

struct edge

int u, v, cost;//u到v的距离为cost

bool cmp(const edge &e1, const edge &e2)//从小到大排序

return e1.cost < e2.cost;

edge es[Maxn];

int par[Maxn];

void init(int n)//初始化并查集

for (int i = 0; i

par[i] = i;

int findr(int x)//寻根

if (par[x] == x)

return x;

return par[x] = findr(par[x]);

void unite(int x, int y)//合并

x = findr(x);

y = findr(y);

if (x == y)

return;

par[x] = y;

bool same(int x, int y)//判断根是否相同

return findr(x) == findr(y);

int kruskal(int V, int E)//kruskal算法求最小生成树

sort(es, es + E, cmp);

init(V);

int res = 0;

for (int i = 0; i < E; i ++)

edge e = es[i];

if (!same(e.u, e.v))

unite(e.u, e.v);

res += e.cost;

return res;

int main()

int T;

scanf(“%d “, &T);

while (T –)//T组测试样例

scanf(“%d%d%d “, &N, &M, &R);//存数据

for (int i = 0; i < R; i ++)

scanf(“%d%d%d “, &x[i], &y[i], &d[i]);

int V, E;

V = N + M;//顶点个数

E = R;//边个数

for (int i = 0; i < E; i ++)//存入结构体

es[i] = (edge){

x[i], N + y[i], -d[i]};

printf(“%d \n “, 10000 * (N + M) + kruskal(V, E));

return 0;

Original: https://www.cnblogs.com/sky-stars/p/11587399.html
Author: Sky丨Star
Title: 【POJ 3723 】Conscription(最小生成树)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/611053/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球