kuangbin_MST A (POJ 1251)
模板题 Kruskal直接过 调试时候居然在sort(edge + 1, edge + 1 + m)上浪费好多时间...
不过本着ACMer的心态自然要测试一下两种方法分别的速度
Kruskal : Memory 392 Time 16
Prim: Memory 576 Time 16
...........哦居然一样啊
Prim
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
#define INF 0x3F3F3F3F
using namespace std; typedef pair<int, int> pii;
struct cmp{
bool operator() (const pii a, const pii b){
return a.first > b.first;
}
}; int size, head[], point[], nxt[], val[];
int n, dist[]; void init()
{
size = ;
memset(head, - ,sizeof head);
} void add(int from, int to, int value)
{
val[size] = value;
point[size] = to;
nxt[size] = head[from];
head[from] = size++;
} int prim(int s)
{
int ans = ;
bool vis[];
memset(dist, 0x3f, sizeof dist);
memset(vis, false, sizeof vis); priority_queue<pii, vector<pii>, cmp> q;
for(int i = head[s]; ~i; i = nxt[i]){
dist[point[i]] = val[i];
q.push(make_pair(val[i], point[i]));
}
dist[s] = ;
vis[s] = true;
while(!q.empty()){
pii u = q.top();
q.pop();
if(vis[u.second]) continue;
vis[u.second] = true;
ans += u.first;
for(int i = head[u.second]; ~i; i = nxt[i]){
int j = point[i];
//printf("check edge[%d][%d] vis = %d value = %d\n", u.second, j, vis[j], val[i]);
if(!vis[j] && dist[j] > val[i]){
//printf("add edge[%d][%d]\n", u.second, j);
dist[j] = val[i];
q.push(make_pair(dist[j], j));
}
}
}
return ans;
} int main()
{
while(scanf("%d", &n), n){
init();
for(int i = ; i < n; i++){
int k;
scanf("%*s%d", &k);
while(k--){
char to[];
int value;
scanf("%s%d", to, &value);
add(i, to[]-'A'+, value);
add(to[]-'A'+, i, value);
}
}
printf("%d\n", prim());
}
return ;
}
Kruskal
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
#define INF 0x3F3F3F3F
using namespace std; int n, m;
int parent[], rank[];
struct Edge{int u, v, w;}edge[]; bool cmp(Edge a, Edge b)
{
return a.w < b.w;
} inline int FindSet(int x)
{
while(x != parent[x]) x = parent[x];
return x;
} void UnionSet(int l, int r)
{
int x = FindSet(l);
int y = FindSet(r);
if(rank[x] > rank[y]){
rank[x] += rank[y];
parent[y] = x;
}
else{
rank[y] += rank[x];
parent[x] = y;
}
} int kruskal()
{
for(int i = ; i <= n; i++){
parent[i] = i;
rank[i] = ;
}
int ans = ;
sort(edge+, edge+m+, cmp);
for(int i = , num = ; num < n- && i <= m; i++){
int x = FindSet(edge[i].u);
int y = FindSet(edge[i].v);
if(x != y){
num++;
UnionSet(x, y);
ans += edge[i].w;
}
}
return ans;
} int main()
{
while(scanf("%d", &n), n){
m = ;
for(int i = ; i < n; i++){
int k;
scanf("%*s%d", &k);
while(k--){
m++;
edge[m].u = i;
char v[];
scanf("%s%d", v, &edge[m].w);
edge[m].v = v[] - 'A' + ;
//printf("Edge %d : u = %d v = %d w = %d\n", m, edge[m].u, edge[m].v, edge[m].w);
}
}
printf("%d\n", kruskal());
}
return ;
}
kuangbin_MST A (POJ 1251)的更多相关文章
- poj 1251 Jungle Roads (最小生成树)
poj 1251 Jungle Roads (最小生成树) Link: http://poj.org/problem?id=1251 Jungle Roads Time Limit: 1000 ...
- POJ 1251 Jungle Roads (prim)
D - Jungle Roads Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Su ...
- poj 1251 poj 1258 hdu 1863 poj 1287 poj 2421 hdu 1233 最小生成树模板题
poj 1251 && hdu 1301 Sample Input 9 //n 结点数A 2 B 12 I 25B 3 C 10 H 40 I 8C 2 D 18 G 55D 1 E ...
- Poj(1251),Prim字符的最小生成树
题目链接:http://poj.org/problem?id=1251 字符用%s好了,方便一点. #include <stdio.h> #include <string.h> ...
- OpenJudge/Poj 1251 丛林中的路/Jungle Roads
1.链接地址: http://bailian.openjudge.cn/practice/1251/ http://poj.org/problem?id=1251 2.题目: 总时间限制: 1000m ...
- (最小生成树) Jungle Roads -- POJ -- 1251
链接: http://poj.org/problem?id=1251 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2177 ...
- POJ 1251 Jungle Roads (zoj 1406) MST
传送门: http://poj.org/problem?id=1251 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=406 P ...
- POJ 1251 Jungle Roads - C语言 - Kruskal算法
Description The Head Elder of the tropical island of Lagrishan has a problem. A burst of foreign aid ...
- poj 1251 统计难题(字典树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1251 AC代码: #include<iostream> #include<algor ...
随机推荐
- Cannot change network to bridged: There are no un-bridged host network adapters解决方法
首先,在你安装上了虚拟机后要确保你也安装了桥接的协议,这可以通过点击右键“网上邻居”,在其中可以看到有两个虚拟出来的网络一个VMnet1,另一个是VMnet8, 如下图所示. 如果没有安装,可以通过下 ...
- CentOS 7.0默认使用的是firewall作为防火墙。
systemctl start firewalld.service#启动firewallsystemctl stop firewalld.service#停止firewallsystemctl dis ...
- init()和deinit()
一.初始化方法(init()) 1.定义:类初始化对象时所调用的方法 2.分类: (1)默认初始化方法 (2)便利初始化方法 (3)使用闭包 3.一些注意点: (1)方法固定名为init,没有返回值, ...
- objectarx 卸载加载arx模块
通常情况下,加载卸载arx模块是使用 APPLOAD命令 使用ObjectARX 代码操作,也非常简单,使用2个全局函数即可,参数为名字有扩展名 C++ int acedArxLoad( const ...
- phpunit+selenium环境搭建
这个环境搭建遇到了挺多麻烦,最终还是没能自己解决,幸好有同事“青蛙”的帮忙解决了这个问题!在这里把本人亲测步骤给大家列一下,希望给大家提供方便! 安装pear: Go-pear.phar下载地址:ht ...
- Ubuntu 14.10 下CPU实时监控mpstat命令详解
简介 mpstat是Multiprocessor Statistics的缩写,是实时系统监控工具.其报告与CPU的一些统计信息,这些信息存放在/proc/stat文件中.在多CPUs系统里,其不但能查 ...
- (转)深入理解javascript的function
原文:http://www.cnblogs.com/sharpxiajun/archive/2011/09/16/2179323.html javascript笔记:深入理解javascript的fu ...
- 0911 Socket网络编程
1.实现ftp上传.下载功能 1.1 循环接收数据直到接收完毕 server端接收client发送的命令(比如说ifconfig),然后server端将命令执行结果反馈给客户端,这时候有个问题,ser ...
- Git ~ 管理修改 ~ Gitasd
现在假设你一经常我了暂存区的概念 , 下面我们将要讨论的就是 , 为什么 Git 比其他的版本控制系统设计的优秀 , 因为 Git 跟踪管理的是修改而非文件 什么是修改 ? 修改就是 你在某个地方 ...
- BZOJ 1093 最大半连通子图
缩点求最长链. #include<iostream> #include<cstdio> #include<cstring> #include<algorith ...