POJ1861 kruskal.

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <math.h>
#include <algorithm>
using namespace std;
#define LL long long
const double pi = acos(-1.0);
#define Len 200005
#define mod 19999997
const int INF = 0x3f3f3f3f;
#define exp 1e-6

#define N 16010
struct asd{
    int s,t;
    int w;
};
asd ss[N];
asd q[N];
int n;
int pre[1010];

bool cmp(asd a,asd b)
{
    return a.w<b.w;
}

int Find(int x)
{
    int r=x;
    while(pre[r]!=r)
    {
        r=pre[r];
    }
    int i=x,j;
    while(pre[i]!=r)
    {
        j=pre[i];
        pre[i]=r;
        i=j;
    }
    return r;
}
void Init()
{
    for(int i=1;i<=n;i++)
        pre[i]=i;
}

int main()
{
    int m;
    int a,b,c;
    cin>>n>>m;

    Init();
    for(int i=0;i<m;i++)
    {
        scanf("%d%d%d",&a,&b,&c);
        q[i].s=a;
        q[i].t=b;
        q[i].w=c;
    }
    sort(q,q+m,cmp);

    int ans,sum;
    ans=-1;
    sum=0;
    for(int i=0;i<m;i++)
    {
        int aa=Find(q[i].s);
        int bb=Find(q[i].t);
        if(aa!=bb)
        {
            ans=max(ans,q[i].w);
            ss[sum].s=q[i].s;ss[sum].t=q[i].t;  
            sum++;
            pre[aa]=bb;
        } 
    }
    printf("%d\n",ans);
    printf("%d\n",sum);
    for(int i=0;i<sum;i++)
    {
        printf("%d %d\n",ss[i].s,ss[i].t);
    }
    return 0;   
}
posted @ 2016-07-04 11:06  see_you_later  阅读(97)  评论(0编辑  收藏  举报