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",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\n",sum);
	}
	return 0;
}

 

posted @ 2019-10-12 22:49  风骨散人  阅读(77)  评论(0编辑  收藏  举报