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 }
原文地址:https://www.cnblogs.com/wydxry/p/7280108.html