poj 1251 kruskal

http://poj.org/problem?id=1251

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
#define maxm 205
#define maxn 30
struct edge
{
    int u,v,w;
} edges[maxm];
int parent[maxn],num,sum;
int N,i,j;
void ufset()
{
    for(i=0; i<maxn; i++)
        parent[i]=-1;
}
int find(int x)
{
    int s;
    for(s=x; parent[s]>=0; s=parent[s]);
    while(s!=x)
    {
        int tmp=parent[x];
        parent[x]=s;
        x=tmp;
    }
    return s;
}
void Union(int R1,int R2)
{
    int r1=find(R1),r2=find(R2);
    int tmp=parent[r1]+parent[r2];
    if(parent[r1]>parent[r2])
    {
        parent[r1]=r2;
        parent[r2]=tmp;
    }
    else
    {
        parent[r2]=r1;
        parent[r1]=tmp;
    }
}
int cmp(const void* a,const void* b)
{
    return ((edge*)a)->w-((edge*)b)->w;
}
int kruskal(int num)
{
    int min = 0;
    int k = 0;
    qsort(edges,num, sizeof(edges[0]), cmp);
    for(int i = 0; i < num; i++)
    {
        if(find(edges[i].v)!= find(edges[i].u))
        {
            Union(edges[i].v,edges[i].u);
            min+=edges[i].w;
            k++;
        }
        if(k == N-1)
            return min;
    }
    return min;
}
int main()
{
    int  r, k, dis;
    char st, en;
  //  freopen("1.txt","r",stdin);
    while(1)
    {
        ufset();
        k= 0;
        cin>>N;
        if(N == 0)
            break;
        for(i = 1; i < N; i++)
        {
            cin>> st >> r;
            for(j = 0; j < r; j++)
            {
                cin>> en >> dis;
                edges[k].u= (int)(st-'A'+1);
                edges[k].v= (int)(en-'A'+1);
                edges[k].w= dis;
                k++;
            }
        }
        cout<< kruskal(k) << endl;
    }
    return 0;
}

  

时间: 2024-07-31 18:27:20

poj 1251 kruskal的相关文章

poj 1251 Jungle Roads MST

   水 /* author:jxy lang:C/C++ university:China,Xidian University **If you need to reprint,please indicate the source** */ #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #defin

poj 2031Building a Space Station(几何判断+Kruskal最小生成树)

/* 最小生成树 + 几何判断 Kruskal 球心之间的距离 - 两个球的半径 < 0 则说明是覆盖的!此时的距离按照0计算 */ #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; int f[105]; struct ball{ double x, y, z, r;

POJ题目分类

初期: 一.基本算法:      (1)枚举. (poj1753,poj2965)      (2)贪心(poj1328,poj2109,poj2586)      (3)递归和分治法.      (4)递推.      (5)构造法.(poj3295)      (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996) 二.图算法:      (1)图的深度优先遍历和广度优先遍历.      (2)最短路径算法(dijkstra,bellman-ford

POJ 1258 Agri-Net:最小生成树 Prim 模版题

Agri-Net:http://poj.org/problem?id=1258 大意:新镇长竞选宣言就是将网络带到每一个农场,给出农场个数,两两之间建光缆的耗费,求所有都联通的最小耗费. 思路:最小生成树,因为边比较稠密,用Prim做. PS:对于比较稠密的图,用Prim,对于比较稀疏的图,用 Kruskal.Kruskal是找边的过程,稀疏的话会比较快. 更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/

poj分类

初期: 一.基本算法:      (1)枚举. (poj1753,poj2965)      (2)贪心(poj1328,poj2109,poj2586)      (3)递归和分治法.      (4)递推.      (5)构造法.(poj3295)      (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996) 二.图算法:      (1)图的深度优先遍历和广度优先遍历.      (2)最短路径算法(dijkstra,bellman-ford

poj1861 kruskal

http://poj.org/problem?id=1861 #include<cstdio> #include<algorithm> #include<cstdlib> using namespace std; #define maxn 1001 #define maxm 15001 struct edge { int u,v,w; } edges[maxm]; int parent[maxn],ans[maxn]; int i,j,N,M; int maxedge,

poj 3522 Slim Span

点击打开链接poj 3522 思路:kruskal + 枚举生成树 分析:题目要求的是找到一个生成树使得生成树中"最大边-最小边"的值最小.如果这个图有n个点,那么这个生成树有n-1条边.那么现在就是考虑怎么去枚举这些生成树,我们想到了跟边有关的就是kruskal.我们只要按照边的大小排好序,然后去枚举最小的边的值,因为每一个生成树都要有n-1条边,所以只要枚举从0-(m-n+1)即可,然后按照求解最小生成树的方法去求每一个生成树,最后求出ans. 代码: #include<io

poj 3625 Building Roads

点击打开链接poj 3625 思路:最小生成树+prim分析:         1 由于点有1000,如果要用kruskal的话最少有1000000条边,所以我么选择用prim算法         2 题目中的点的坐标最大值为10^6,那么如果在平方一下的话会超过int,所以在求两个点之间的距离的时候用在前面乘上一个1.0这样就表示的double从而不会超过int了.         3 题目中的说了,要用64位的浮点数,所以选择用long double .输出的时候是"%0.2Lf"

poj1287 kruskal

http://poj.org/problem?id=1287 #include<cstdio> #include<cstdlib> #include<iostream> #define N 60 using namespace std; struct node { int x,y; int len; } city[2600]; typedef struct node NODE; int n,m,pre[N]; int cmp(const void *a,const vo