zoukankan      html  css  js  c++  java
  • 51Nod 1212 无向图最小生成树 (路径压缩)

    N个点M条边的无向连通图,每条边有一个权值,求该图的最小生成树。
     
    Input
    第1行:2个数N,M中间用空格分隔,N为点的数量,M为边的数量。(2 <= N <= 1000, 1 <= M <= 50000)
    第2 - M + 1行:每行3个数S E W,分别表示M条边的2个顶点及权值。(1 <= S, E <= N,1 <= W <= 10000)
    Output
    输出最小生成树的所有边的权值之和。
    Input示例
    9 14
    1 2 4
    2 3 8
    3 4 7
    4 5 9
    5 6 10
    6 7 2
    7 8 1
    8 9 7
    2 8 11
    3 9 2
    7 9 6
    3 6 4
    4 6 14
    1 8 8
    Output示例
    37

    题解:还是套模板 但是之前边数开小了哇了半天 (测试了几次还是开挂的快)
     1 #include <iostream>
     2 #include <algorithm>
     3 #include <cstring>
     4 #include <cstdio>
     5 #include <vector>
     6 #include <cstdlib>
     7 #include <iomanip>
     8 #include <cmath>
     9 #include <ctime>
    10 #include <map>
    11 #include <set>
    12 #include <queue>
    13 using namespace std;
    14 #define lowbit(x) (x&(-x))
    15 #define max(x,y) (x>y?x:y)
    16 #define min(x,y) (x<y?x:y)
    17 #define MAX 100000000000000000
    18 #define MOD 1000000007
    19 #define pi acos(-1.0)
    20 #define ei exp(1)
    21 #define PI 3.141592653589793238462
    22 #define INF 0x3f3f3f3f3f
    23 #define mem(a) (memset(a,0,sizeof(a)))
    24 typedef long long ll;
    25 ll gcd(ll a,ll b){
    26     return b?gcd(b,a%b):a;
    27 }
    28 bool cmp(int x,int y)
    29 {
    30     return x>y;
    31 }
    32 const int N=50005;
    33 const int mod=1e9+7;
    34 int f[N];
    35 struct edge
    36 {
    37     int u,v,w,flag;
    38 }a[N];
    39 void init()
    40 {
    41     for(int i=1;i<=N;i++)
    42         f[i]=i;
    43 }
    44 int find1(int x)
    45 {
    46     if(x!=f[x])
    47          f[x]=find1(f[x]);
    48     return f[x];
    49 }
    50 bool cmp1(edge a,edge b)
    51 {
    52     return a.w<b.w;
    53 }
    54 int main()
    55 {
    56     std::ios::sync_with_stdio(false);
    57     int n,m;
    58     cin>>n>>m;
    59         init();
    60         for(int i=0;i<m;i++)
    61             cin>>a[i].u>>a[i].v>>a[i].w;
    62         sort(a,a+m,cmp1);
    63         int s=0;
    64         for(int i=0;i<m;i++){
    65             int u=a[i].u,v=a[i].v,w=a[i].w;
    66             if(find1(u)==find1(v)) continue;
    67             f[find1(u)]=find1(v);
    68             s+=w;
    69         }
    70         cout<<s<<endl;
    71     return 0;
    72 }
  • 相关阅读:
    线程
    网络编程
    正则表达式
    XML
    java----八种排序算法
    Java 关键字 速查表
    Day_19多线程(下)
    Day18_进程(中)
    Day17_进程(上)
    Day15_IO流(上)
  • 原文地址:https://www.cnblogs.com/wydxry/p/7280108.html
Copyright © 2011-2022 走看看