HDU 3371 Kruskal
来源:互联网 发布:剪枝算法 编辑:程序博客网 时间:2024/06/07 02:08
这里边比较多,而且告诉了所需的边以及它们的权值,所以只要遍历edge,利用Kruskal算法
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define LLEN 25005int n, m, k;int map[505][505];int conn[505][505];typedef struct Edge{int u, v;int w;}Edge;Edge e[LLEN];int p[LLEN];int f[LLEN];bool cmp(Edge a, Edge b) {return a.w < b.w;}int find(int x) {return p[x] == x ? x : (p[x] = find(p[x]));}int kruskal(int n, int m) {int k = 1;int sum = 0;for(int i = 0; i < n; i++) {for(int j = 0; j < n; j++) {if(i == j) continue;if(p[j] == i) {k++;}}}sort(e, e+m, cmp);for(int i = 0; k < n && i < m; i++) {int x = find(e[i].u);int y = find(e[i].v);if(x != y) {sum += e[i].w;p[x] = y;k++;}}if(k < n) return -1;else return sum;}int main() {int file;scanf("%d", &file);while(file--) {scanf("%d%d%d", &n, &m, &k);for(int i = 0; i < m; i++) {scanf("%d%d%d", &e[i].u, &e[i].v, &e[i].w);e[i].u--;e[i].v--;}for(int i = 0; i < n; i++) {p[i] = i;}for(int i = 0; i < k; i++) {int a;scanf("%d", &a);for(int j = 0; j < a; j++) {scanf("%d", &f[j]);f[j]--;}for(int j = 1; j < a; j++) {p[find(f[j])] = find(f[j-1]);}}int ans = kruskal(n, m);printf("%d\n", ans);}return 0;}
- HDU 3371 Kruskal
- HDU 3371 最小生成树 kruskal
- hdu 3371 Connect the Cities【kruskal&prim】
- HDU 3371 Prim或kruskal实现
- HDU 3371 Connect the Cities 【kruskal】
- hdu 1102 kruskal
- hdu 1233 kruskal
- hdu 4313(kruskal思想)
- HDU 1102 Kruskal
- hdu 1162(Kruskal)
- hdu 1863 kruskal
- HDU 1863-kruskal
- HDU 1875-kruskal
- hdu 1863(prim&kruskal)
- HDU 3367 Pseudoforest(Kruskal)
- HDU 1233 Kruskal算法
- HDU 4463 kruskal 水题
- hdu 1863 Kruskal起步
- javaScript学习笔记概述
- Android常用控件的基本使用方法
- 内核模块编程之模块工具的使用
- Java读取properties文件的简单方法
- Linux Init, Getty, Login
- HDU 3371 Kruskal
- C#中如何解决参数个数可变的问题
- 思维导图
- Linux 内核list_head 学习
- 安装vsftpd
- the personal understanding about JAVA Heap space and GC
- 未能找到类型或命名空间名称“DbSet”
- 鸡尾酒排序
- 【推荐】Andorid安全测试框架drozer