POJ 1287

Kruskal模板题,需要注意,这道题空间限制很严格,第一遍下意识的开了一个记录数组(因为一对节点之间允许多条路经,这里想着进行优化,不过弄巧成拙了,遇到了第一个MLE)

#include <iostream>
#include <algorithm>
#include <queue>
#include <string>
#include <vector>
#include <cstdio>
#include <cstring>
#include <string>
#include <stack>
#include <map>
#include <set>
using namespace std;

const int maxp= 55;
const int maxr= 1250;

struct Edge
{
	int u, v, c;
	Edge(int _u= 0, int _v= 0, int _c= 0) : u(_u), v(_v), c(_c) {}	
	bool operator < (const Edge &rhs) const
	{
		return c< rhs.c;
	}
};
Edge G[maxr];
int fa[maxp];

void AddEdge(int i, int u, int v, int c)
{
	G[i]= Edge(u, v, c);
}
int Find(int x)
{
	if (x== fa[x]){
		return x;
	}
	return fa[x]= Find(fa[x]);
}
int Kruskal(int n, int m)
{
	sort(G, G+m);
	int cnt= n, ans= 0;

	for (int i= 0; i< m; ++i){
		int u= G[i].u, v= G[i].v;

		if (Find(u)== Find(v)){
			continue;
		}

		ans+= G[i].c;
		fa[fa[u]]= fa[fa[v]];
		if (1== --cnt){
			break;
		}
	}

	return cnt > 1 ? -1 : ans;
}

int main(int argc, char const *argv[])
{
	int p, r;
	int u, v, c;
	while (~scanf("%d", &p) && p){
		scanf("%d", &r);
		for (int i= 1; i<= p; ++i){
			fa[i]= i;
		}
		for (int i= 0; i< r; ++i){
			scanf("%d %d %d", &u, &v, &c);
			AddEdge(i, u, v, c);
		}

		printf("%d\n", Kruskal(p, r));
	}
	return 0;
}
posted @ 2021-04-11 22:58  IdiotNe  阅读(33)  评论(0编辑  收藏  举报