模板题 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)的更多相关文章

  1. poj 1251 Jungle Roads (最小生成树)

    poj   1251  Jungle Roads  (最小生成树) Link: http://poj.org/problem?id=1251 Jungle Roads Time Limit: 1000 ...

  2. POJ 1251 Jungle Roads (prim)

    D - Jungle Roads Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Su ...

  3. 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 ...

  4. Poj(1251),Prim字符的最小生成树

    题目链接:http://poj.org/problem?id=1251 字符用%s好了,方便一点. #include <stdio.h> #include <string.h> ...

  5. OpenJudge/Poj 1251 丛林中的路/Jungle Roads

    1.链接地址: http://bailian.openjudge.cn/practice/1251/ http://poj.org/problem?id=1251 2.题目: 总时间限制: 1000m ...

  6. (最小生成树) Jungle Roads -- POJ -- 1251

    链接: http://poj.org/problem?id=1251 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2177 ...

  7. POJ 1251 Jungle Roads (zoj 1406) MST

    传送门: http://poj.org/problem?id=1251 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=406 P ...

  8. POJ 1251 Jungle Roads - C语言 - Kruskal算法

    Description The Head Elder of the tropical island of Lagrishan has a problem. A burst of foreign aid ...

  9. poj 1251 统计难题(字典树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1251 AC代码: #include<iostream> #include<algor ...

随机推荐

  1. Cannot change network to bridged: There are no un-bridged host network adapters解决方法

    首先,在你安装上了虚拟机后要确保你也安装了桥接的协议,这可以通过点击右键“网上邻居”,在其中可以看到有两个虚拟出来的网络一个VMnet1,另一个是VMnet8, 如下图所示. 如果没有安装,可以通过下 ...

  2. CentOS 7.0默认使用的是firewall作为防火墙。

    systemctl start firewalld.service#启动firewallsystemctl stop firewalld.service#停止firewallsystemctl dis ...

  3. init()和deinit()

    一.初始化方法(init()) 1.定义:类初始化对象时所调用的方法 2.分类: (1)默认初始化方法 (2)便利初始化方法 (3)使用闭包 3.一些注意点: (1)方法固定名为init,没有返回值, ...

  4. objectarx 卸载加载arx模块

    通常情况下,加载卸载arx模块是使用 APPLOAD命令 使用ObjectARX 代码操作,也非常简单,使用2个全局函数即可,参数为名字有扩展名 C++ int acedArxLoad( const ...

  5. phpunit+selenium环境搭建

    这个环境搭建遇到了挺多麻烦,最终还是没能自己解决,幸好有同事“青蛙”的帮忙解决了这个问题!在这里把本人亲测步骤给大家列一下,希望给大家提供方便! 安装pear: Go-pear.phar下载地址:ht ...

  6. Ubuntu 14.10 下CPU实时监控mpstat命令详解

    简介 mpstat是Multiprocessor Statistics的缩写,是实时系统监控工具.其报告与CPU的一些统计信息,这些信息存放在/proc/stat文件中.在多CPUs系统里,其不但能查 ...

  7. (转)深入理解javascript的function

    原文:http://www.cnblogs.com/sharpxiajun/archive/2011/09/16/2179323.html javascript笔记:深入理解javascript的fu ...

  8. 0911 Socket网络编程

    1.实现ftp上传.下载功能 1.1 循环接收数据直到接收完毕 server端接收client发送的命令(比如说ifconfig),然后server端将命令执行结果反馈给客户端,这时候有个问题,ser ...

  9. Git ~ 管理修改 ~ Gitasd

    现在假设你一经常我了暂存区的概念 , 下面我们将要讨论的就是 , 为什么 Git 比其他的版本控制系统设计的优秀 , 因为 Git 跟踪管理的是修改而非文件 什么是修改  ? 修改就是 你在某个地方 ...

  10. BZOJ 1093 最大半连通子图

    缩点求最长链. #include<iostream> #include<cstdio> #include<cstring> #include<algorith ...