zoukankan      html  css  js  c++  java
  • 51NOD 1212 无向图最小生成树

    N个点M条边的无向连通图,每条边有一个权值,求该图的最小生成树。

    输入

    第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)

    输出

    输出最小生成树的所有边的权值之和。

    输入样例

    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

    输出样例

    37
    #include<iostream>
    #include<queue>
    #include<algorithm>
    #include<set>
    #include<cmath>
    #include<vector>
    #include<map>
    #include<stack>
    #include<bitset>
    #include<cstdio>
    #include<cstring>
    //---------------------------------Sexy operation--------------------------//
     
    #define cini(n) scanf("%d",&n)
    #define cinl(n) scanf("%lld",&n)
    #define cinc(n) scanf("%c",&n)
    #define cins(s) scanf("%s",s)
    #define coui(n) printf("%d",n)
    #define couc(n) printf("%c",n)
    #define coul(n) printf("%lld",n)
    #define debug(n) printf("%d_________________________________
    ",n);
    #define speed ios_base::sync_with_stdio(0)
    #define file  freopen("input.txt","r",stdin);freopen("output.txt","w",stdout)
    //-------------------------------Actual option------------------------------//
    #define rep(i,a,n) for(int i=a;i<=n;i++)
    #define per(i,n,a) for(int i=n;i>=a;i--)
    #define Swap(a,b) a^=b^=a^=b
    #define Max(a,b) (a>b?a:b)
    #define Min(a,b) a<b?a:b
    #define mem(n,x) memset(n,x,sizeof(n))
    #define mp(a,b) make_pair(a,b)
    #define pb(n)  push_back(n)
    #define dis(a,b,c,d) ((double)sqrt((a-c)*(a-c)+(b-d)*(b-d)))
    //--------------------------------constant----------------------------------//
     
    #define INF  0x3f3f3f3f
    #define esp  1e-9
    #define PI   acos(-1)
    using namespace std;
    typedef pair<int,int>PII;
    typedef pair<string,int>PSI;
    typedef  long long ll;
    //___________________________Dividing Line__________________________________/
     
    int n,m;
    int father[1100000];
    struct node
    {
    	int x;
    	int y;
    	int k;
    }Q[1100000];
    int find(int x)
    {
    	if(father[x]==x)
    	return x;
    	return father[x]=find(father[x]);
    }
    bool cmp(node a,node b)
    {
    	return a.k<b.k;
    }
    int main()
    {
    	while(~scanf("%d %d",&n,&m))
    	{
    		int cont=0,sum=0,st=0;
    		for(int i=0;i<m;i++)
    		{
    			scanf("%d %d %d",&Q[i].x,&Q[i].y,&Q[i].k);
    			cont+=Q[i].k;
    		}
    		sort(Q,Q+m,cmp);
    		for(int i=1;i<=n;i++) father[i]=i;
    		for(int i=0;i<m;i++)
    		{
    			int tx=find(Q[i].x);
    			int ty=find(Q[i].y);
    			if(tx!=ty)
    			{
    				sum+=Q[i].k;
    				st++;
    				father[tx]=ty;
    				if(st==n-1)
    				break;
    			}
    		}
    	   printf("%d
    ",sum);
    	}
    	return 0;
    }
  • 相关阅读:
    算法笔记codeup-Contest100000568
    算法笔记codeup-Contest100000567
    算法笔记codeup-Contest100000566
    人工智能各种知识点(大杂烩)
    人工智能基础知识复习:机器学习
    人工智能基础知识复习:神经计算 演化计算 模糊计算
    人工智能基础知识复习:问题求解与搜索
    人工智能基础知识复习:推理技术
    前端基础知识学习:概念篇
    MYSQL
  • 原文地址:https://www.cnblogs.com/lunatic-talent/p/12798693.html
Copyright © 2011-2022 走看看