Program4_G
来源:互联网 发布:海奇软件app 编辑:程序博客网 时间:2024/06/04 00:27
我现在做的是第四专题编号为1007的试题,具体内容如下所示:
Problem G
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 62 Accepted Submission(s) : 6
16 4 31 4 22 6 12 3 53 4 332 1 22 1 33 4 5 6
1
简单题意:
给定n个点,m条边和t个已经联通的集合,求最小生成树。
解题思路:
:kruskal就是以边为中心,每次贪心选择最短边以构建一棵最小生成树,并查集的作用是一开始初始化成n棵树,对应n个节点,每次读入一条边时判断该边的起点和终点是否在同一棵树中,若是则不能读取该边,否则会构成环,若不是同一棵树则将这两棵树合并,记录树总数的变量减一,最后若该变量等于1代表最小生成树已经找到了,若遍历所有边后该变量依旧不等于1则没有最小生成树。
编写代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define maxn 502
#define maxm 25002
int id, pre[maxn];
int count, ans;
struct Node{
int from, to, val;
} edge[maxm];
void addEdge(int a, int b, int c)
{
edge[id].from = a;
edge[id].to = b;
edge[id++].val = c;
}
int unionFind(int k)
{
int a = k;
while(pre[k] != -1) k = pre[k];
int b;
while(a != k){
b = pre[a];
pre[a] = k;
a = b;
}
return k;
}
int cmp(const void* a, const void* b){
return ((Node *)a)->val - ((Node *)b)->val;
}
bool kruskal()
{
qsort(edge, id, sizeof(Node), cmp);
int x, y, i;
for(i = 0; i < id; ++i){
x = unionFind(edge[i].from);
y = unionFind(edge[i].to);
if(x != y){
ans += edge[i].val;
--count; pre[y] = x;
if(1 == count) return true;
}
}
return 1 == count;
}
int main()
{
int cas, n, m, k, t, a, b, c, i;
scanf("%d", &cas);
while(cas--){
memset(pre, -1, sizeof(pre));
scanf("%d%d%d", &n, &m, &k);
for(i = id = 0; i < m; ++i){
scanf("%d%d%d", &a, &b, &c);
addEdge(a, b, c);
}
count = n; ans = 0;
for(i = 0; i < k; ++i){
scanf("%d%d", &t, &a);
a = unionFind(a);
while(--t){
scanf("%d", &b);
b = unionFind(b);
if(a != b){
pre[b] = a;
--count;
}
}
}
if(!kruskal()) printf("-1\n");
else printf("%d\n", ans);
}
return 0;
}
- Program4_G
- 5-16 求符合给定条件的整数集 (15分)
- 【一天一道LeetCode】#121. Best Time to Buy and Sell Stock
- 7_4_K题 Triangle Counting 题解 [uva 11401](计数)
- Go语言学习笔记7
- 加解密 签名
- Program4_G
- Android编程实现自动检测版本及自动升级的方法
- Linux开发工具(gcc gdb make shell)——c的预处理、编译、汇编和链接
- c++面向对象编程补充(一) 重载 覆盖 隐藏区别
- java注释规范
- 【树的重心】 POJ 1655 Balancing Act
- HDU 1829 A Bug's Life(基础种类并查集)
- LeetCode刷题系列(十六)Some Little Questions
- 日本国立国会图书馆书籍批量下载(一)