poj2395 Out of Hay , 求MST的最长边

点击打开链接

求MST的最长边~

prim

#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#define Min(a,b) (a)<(b)?(a):(b)
using namespace std;

const int INF = 1000000000;
const int maxn = 2000 + 5;

struct pto
{
    int v, len;
};

vector<pto> G[maxn];
bool vis[maxn];
int dis[maxn];
int n, m;

int Prim()
{
    int i, j, p, ans, minc;
    memset(vis, 0, sizeof vis );
    for(i=1; i<=n; ++i) dis[i] = INF;
    dis[1] = 0;
    ans = 0;
    int maxx = -100;
    for(i=1; i<=n; ++i)
    {
        minc = INF, p = -1;
        for(j=1; j<=n; ++j) if(!vis[j])
            if(minc>dis[j]) minc = dis[p=j];
        if(-1 == p) break;
        vis[p] = 1;
        if(maxx <minc) maxx = minc;
        for(j=0; j<G[p].size(); ++j) if(!vis[G[p][j].v])
        {
            int& u = G[p][j].v;
            dis[u] = Min(dis[u], G[p][j].len);
        }
    }
    return maxx;
}

int main()
{
    int i, x, y, z;
    pto e;
    while(~scanf("%d%d",&n,&m))
    {
        for(i=0; i<=n; ++i) G[i].clear();
        for(i=0; i<m; ++i)
        {
            scanf("%d%d%d",&x,&y,&z);
            e.v = y, e.len = z;
            G[x].push_back(e);
            e.v = x;
            G[y].push_back(e);
        }
        printf("%d\n",Prim());
    }
    return 0;
}
kruskal
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;

const int INF = 1000000000;
const int maxn = 2000 + 5;
const int maxm = 10000 + 5;

struct Edge {
    int x, y, w;
    Edge(int x=0, int y=0, int w=0):x(x),y(y),w(w) {}
    bool operator < (const Edge& rhs) const {
        return w < rhs.w;
    }
} e[maxm];
int fa[maxn];
int n, m;

int getfather(int x)
{
    while(x != fa[x])
        x = fa[x];
    return fa[x];
}

int kruskal()
{
    int i, t1, t2, ans = 0, num = 0;
    int maxx = -100;
    sort(e, e+m);
    for(i=1; i<=n; ++i) fa[i] = i;
    for(i=0; i<m; ++i) {
        t1 = getfather(e[i].x);
        t2 = getfather(e[i].y);
        if(t1 != t2) {
            fa[t1] = t2;
            ans += e[i].w;
            if(maxx<e[i].w) maxx = e[i].w;
            if(++num==n-1) break;
        }
    }
    return maxx;
}

int main()
{
    int i, x, y, z;
    while(~scanf("%d%d",&n,&m)) {
        for(i=0; i<m; ++i) {
            scanf("%d%d%d",&e[i].x, &e[i].y, &e[i].w);
        }
        printf("%d\n", kruskal());
    }
    return 0;
}

poj2395 Out of Hay , 求MST的最长边,布布扣,bubuko.com

时间: 2024-10-22 11:32:10

poj2395 Out of Hay , 求MST的最长边的相关文章

POJ 1861 Network (Kruskal求MST模板题)

Network Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 14103   Accepted: 5528   Special Judge Description Andrew is working as system administrator and is planning to establish a new network in his company. There will be N hubs in the c

VIJOS1107 求树的最长链

vijos1107环游大同80天 学习了一下求树的最长链的方法 最简单的思路就是两次dfs 两次dfs分别有什么用呢? 第一次dfs,求出某个任意的点能到达的最远的点 第二次dfs,从所搜到的最远的点倒搜回去. 为什么需要两次呢? 其实很容易想通第一遍dfs的起始点或许并不是最长链的起点 从最远的点倒搜到的最长的链就是所求的解 (因为最长链一定经过这个最远的点啊... 这里注意题目表述: 假设任意的两个风景点都有且仅有一条路径(无回路)相连.显然,任意一个风景点都可以作为游览路线的起点或者终点.

求数组中最长递增子序列的长度

个人信息:就读于燕大本科软件工程专业 目前大三; 本人博客:google搜索"cqs_2012"即可; 个人爱好:酷爱数据结构和算法,希望将来从事算法工作为人民作出自己的贡献; 编程语言:C++ ; 编程坏境:Windows 7 专业版 x64; 编程工具:vs2008; 制图工具:office 2010 powerpoint; 硬件信息:7G-3 笔记本; 真言 怒冲北京,为理想前行. 题目 解法 使用工具栈单枝遍历数组(思路源于工具栈可以双枝遍历二叉树的方法) 栈里存放的是数组的下

求树中的最长路 (*【模板】)

两次DFS求树中的最长路. 基于邻接矩阵: 代码: #include <stdio.h> #include <string.h> #include <vector> #include <iostream> #include <string> #include <algorithm> using namespace std; bool map[10001][10001]; int n; int tail; bool vis[1001];

hiho#1032 : 最长回文子串 (manacher算法O(n)时间求字符串的最长回文子串 )

#1032 : 最长回文子串 时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一连串的字符串,于是小Hi就向小Ho提出了那个经典的问题:"小Ho,你能不能分别在这些字符串中找到它们每一个的最长回文子串呢?" 小Ho奇怪的问道:"什么叫做最长回文子串呢?" 小Hi回答道:"一个字符串中连续的一

编程之美5:求数组中最长递增子序列

最近楼楼被男朋友带着玩dota,有点上瘾,终于在昨天晚上作出了一个重大的决定,shift+delete删掉warIII文件夹,从此退出dota的明争暗斗.不过最近看男票已经将战场从11转到了topcoder,嗯,这是个好现象,希望楼楼也能跟着玩儿起来. 理想是美好的,唉,可是楼主还在编程之美的初级阶段啊.话不多说了,希望自己加油加油再加油!!(^o^)/~ 今天要看的一道题目是求数组中最长递增子序列. 题目简介: 写一个时间复杂度尽可能低的程序,求一个一维数组(N)个元素中的最长递增子序列的长度

[算法]求数组中最长递增子序列长度

思路: 1.开辟数组L,L[i]记录的为a[0]~a[i]的最长递增子序列长度 2.开辟数组maxV,maxV[i]记录的为长度为i的各递增子序列的最后一个元素的最小值,譬如有子序列 1,2,4 1,2,5 则maxV[3] = 4 3.使用maxLen记录当前的最长递增子序列长度 4.转移方程: L[i+1] = max{1,L[j]+1] , a[i] > maxV[j] && j <= maxLen int LIS(int* a, int n){ int* maxV =

算法练习:求字符串的最长重复子串(Java实现)

1. 求字符串的最长重复子串 例如:aaaaaaaaabbbbcccaaassscvvv这里面的最长重复子串为aaaaaaaaa 算法思路:算法时间复杂度(O(n)) 1. 将这一个字符串先转成char数组: 2. 将这一char数组进行遍历 3. 比较char数组中第i-1个与第i个的字符是否相等,如果不相等则进行截取字符串长度,然后将其进行比较,如果其长度比现有长度大,则进行替换,否则什么也不做 算法实现:(Java实现) private static String reSubStr(Str

POJ2395 Out of Hay【Kruskal】

Out of Hay Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11656Accepted: 4562 Description The cows have run out of hay, a horrible event that must be remedied immediately. Bessie intends to visit the other farms to survey their hay situat