mycs

导航

 

prime O(n^2)
从一点开始选择距离最小的点扩大集合U至整个图G,维护距离数组表示未加入集合的点到集合的最小距离

    /*
      d[N]距离数组
      vis[N]是否加入集合
    */
	d[1] = 0;//从点1开始
	int ans = 0;
	int flag = 1;//图是否联通
	for (int i = 0; i < n; i++) {
		int target = 0;
		for (int j = 1; j <= n; j++) {//找到距离最小的未加入集合的点
			if ((vis[j] == 0) && (target == 0 || d[target] > d[j])) {
				target = j;
			}
		}
		if (target == 0||d[target]>0x3f3f/2) {
			flag = 0;
			break;
		}
		else {
			ans += d[target];
			vis[target] = 1;
			for (auto link : e[target]) {//松弛操作 维护数组
				int v = link.first;
				int w = link.second;
				if (d[v] > w)d[v] = w;
			}
		}
	}

kruskal O(mlogm)

	for (int i = 1; i <= n; i++) {
		fa[i] = i;
	}
	for (int i = 0; i < m; i++) {
		int a1, a2, ww;
		cin >> a1 >> a2 >> ww;
		edge* curr = new edge;
		curr->a = a1;
		curr->b = a2;
		curr->w = ww;
		q.push(curr);
	}
	int ans = 0;
	int flagfin = 1;
	while (!q.empty()&&flagfin!=n) {
		edge* e = q.top();
		q.pop();
		int n1 = e->a;
		int n2 = e->b;
		if (find(n1) == find(n2))continue;
		ans += e->w;
		fa[find(n1)] = find(n2);
		flagfin++;
	}
posted on 2025-11-14 18:57  Radarman108  阅读(6)  评论(0)    收藏  举报