zoukankan      html  css  js  c++  java
  • POJ 1861 Network

    题意:有n个点,部分点之间可以连接无向边,每条可以连接的边都有一个权值。求一种连接方法将这些点连接成一个连通图,且所有连接了的边中权值最大的边权值最小。

    解法:水题,直接用Kruskal算法做一遍就行了,不过还是应该仔细想想为什么Kruskal可行。原因是,在从小边往大边遍历的过程中(一直保持图为连通图),若判定某边i必须被连接,则因为图是连通图,所以连接比它小的边不可能使边i不需要连接,所以,要使边i不需要连接,必须连接比它大的边,根据题目要求,还是连接边i情况更优。

    tag:最小生成树

     1 /*
     2  * Author:  Plumrain
     3  * Created Time:  2013-11-24 20:57
     4  * File Name: G-POJ-1861.cpp
     5  */
     6 #include <iostream>
     7 #include <cstdio>
     8 #include <cstring>
     9 #include <algorithm>
    10 #include <vector>
    11 
    12 using namespace std;
    13 
    14 #define CLR(x) memset(x, 0, sizeof(x))
    15 #define PB push_back
    16 const int maxm = 15005 * 2;
    17 const int maxn = 1005;
    18 
    19 struct pat{
    20     int s, t, l;
    21 };
    22 
    23 pat p[maxm];
    24 bool v[maxm];
    25 vector<int> ans;
    26 int n, m, all, f[maxn];
    27 
    28 bool cmp(pat a, pat b)
    29 {
    30     return a.l < b.l;
    31 }
    32 
    33 void init()
    34 {
    35     int t1, t2, t3;
    36     all = 0;
    37     for (int i = 0; i < m; ++ i){
    38         scanf ("%d%d%d", &t1, &t2, &t3);
    39         -- t1; -- t2;
    40         p[all].s = p[all+1].t = t1;
    41         p[all].t = p[all+1].s = t2;
    42         p[all++].l = t3;
    43         p[all++].l = t3;
    44     }
    45 }
    46 
    47 void Kruskal()
    48 {
    49     sort(p, p+all, cmp);
    50     for (int i = 0; i < n; ++ i) f[i] = i;
    51     CLR (v);
    52     for (int i = 0; i < all; ++ i){
    53         int t1 = p[i].s, t2 = p[i].t;
    54         while (t1 != f[t1]) t1 = f[t1];
    55         while (t2 != f[t2]) t2 = f[t2];
    56         if (t1 != t2){
    57             v[i] = 1;
    58             f[t1] = t2;
    59         }
    60     }
    61 }
    62 
    63 int main()
    64 {
    65     while (scanf ("%d%d", &n, &m) != EOF){
    66         init();
    67         Kruskal();
    68 
    69         ans.clear();
    70         int cnt = 0;
    71         for (int i = 0; i < all; ++ i) if (v[i]){
    72             cnt = max(i, cnt);
    73             ans.PB(i);
    74         }
    75         int sz = ans.size();
    76         printf ("%d
    %d
    ", p[cnt].l, sz);
    77         for (int i = 0; i < sz; ++ i)
    78             printf ("%d %d
    ", p[ans[i]].s+1, p[ans[i]].t+1);
    79     }
    80     return 0;
    81 }
    View Code
    ------------------------------------------------------------------
    现在的你,在干什么呢?
    你是不是还记得,你说你想成为岩哥那样的人。
  • 相关阅读:
    时间函数的查询-thinkphp
    关于回退的解决
    get post的区别
    日期函数及其查询
    asp MVC的一些tip总结
    asp.net mvc中cookie的完整理解
    解决.net移除dll文件以后依旧报错
    ASP.net MVC redis完整示例(含集合,哈希,sortedset)
    JavaScript实现图的深度广度优先遍历
    JavaScript实现二叉查找树
  • 原文地址:https://www.cnblogs.com/plumrain/p/POJ_1861.html
Copyright © 2011-2022 走看看