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>
#define INF 1E9
using namespace std;
int fa[30];
int far(int nn)
{
    if(fa[nn]<0)return nn;
    return fa[nn]=far(fa[nn]);
}
struct edge
{
    int v,a,b;
};
edge e[80];
bool cmp(edge a,edge b)
{
    return a.v<b.v;
}
int main()
{
    int n,i,j,m,v,a,b;
    char t;
    while(~scanf("%d",&n)&&n)
    {
        int K=0;
        memset(fa,-1,sizeof(fa));
        for(i=0;i<n-1;i++)
        {
            scanf(" %*c%d",&m);
            for(j=0;j<m;j++)
            {
               scanf(" %c%d",&t,&v);
               e[K++]=edge{v,i,t-'A'};
            }
        }
        sort(e,e+K,cmp);
        int ans=0;
        for(i=1,j=0;i<n;j++)
        {
            a=far(e[j].a);
            b=far(e[j].b);
            if(a==b)continue;
            fa[b]=a;ans+=e[j].v;
            i++;
        }
        printf("%d\n",ans);
    }
}
时间: 2024-10-30 18:48:14

poj 1251 Jungle Roads MST的相关文章

poj 1679 The Unique MST:次小生成树

链接: http://poj.org/problem?id=1679 题目: Description Given a connected undirected graph, tell if its minimum spanning tree is unique. Definition 1 (Spanning Tree): Consider a connected, undirected graph G = (V, E). A spanning tree of G is a subgraph of

算法:poj 1947 Rebuilding Roads (树形背包dp)

题意 给一棵树,问最少删掉几条边.使得剩下的子树中有节点个数为p个的 思路 几天前就看了 这题, 但是没什么想法,之后每天都有去想一下, 直到今天, 在我对自己方法还有怀疑 的情况下,竟然AC了 .. f(i, j) 表示子树i,保留j个节点的最少删边次数, 注意,这里保留的j个节点的子树,是指根节点 为i的且有j个节点的子树.这样理解的话, 状态转移就容易想多了. 对于子树i, 如果只保留1个节 点,那么连接它所有儿子节点的边都要删掉, 所以可以初始化 f(i, 1) = 节点i的儿子个数 f

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

【POJ 1679 The Unique MST】最小生成树

无向连通图(无重边),判断最小生成树是否唯一,若唯一求边权和. 分析生成树的生成过程,只有一个圈内出现权值相同的边才会出现权值和相等但"异构"的生成树.(并不一定是最小生成树) 分析贪心策略求最小生成树的过程(贪心地选最短的边来扩充已加入生成树的顶点集合U),发现只有当出现"U中两个不同的点到V-U中同一点的距离同时为当前最短边"时,才会出现"异构"的最小生成树. 上图为kruscal和prim生成过程中可能遇到的相等边的情况,红色和蓝色的为权值

poj 1679 The Unique MST

点击打开链接poj 1679 思路:最小生成树+次小生成树 分析:判断最小生成树是否是唯一的,那就可以去判断次小生成树是否大于最小生成树.这里就涉及到了次小生成树的求法 求解次小生成树: step 1.  先用prim求出最小生成树T.              在prim的同时,用一个矩阵max[u][v] 记录 在T中连结任意两点u,v的唯一的              路中权值最大的那条边的权值. (注意这里).              这是很容易做到的,因为prim是每次增加一个结点s

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"

poj 3206 Borg Maze MST

    很无聊的题目,先bfs求下最短,再prim,输入还有多余空格--懒得敲了,随便找了个代码. 以下代码从http://hi.baidu.com/00gfzs/item/6dd7bf221b955c404799624a转载 #include <iostream> #include <queue> #include <cstring> #include <cstdio> using namespace std; int Val[102]; //prim记录

poj 1789 Truck History MST

   prim /* 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 <queue> #define

HDOJ 1301 Jungle Roads

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1301   //HDOJ1301 #include<iostream>#include<cstring> using namespace std; #define MAX 99999 #define LEN 30 int dist[LEN];//某点的权值 起始点到目标点的权值 int map[LEN][LEN];//某点到某点两点之间的权值 bool isvisitd[LEN];//表