现在的位置: 首页 > 综合 > 正文

POJ1861&ZOJ1542–Network【最小生成树】

2018年04月24日 ⁄ 综合 ⁄ 共 1289字 ⁄ 字号 评论关闭

链接:http://poj.org/problem?id=1861

最小生成树裸题,输出生成树的最长边、节点个数、节点坐标。另外OJ上样例输出时错的,4个点的最小生成树怎么可能4条边。。

主要是熟悉手写kruskal

#include<cstring>
#include<string>
#include<fstream>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cctype>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<stack>
#include<ctime>
#include<cstdlib>
#include<functional>
#include<cmath>
using namespace std;
#define PI acos(-1.0)
#define MAXN 20010
#define eps 1e-7
#define INF 0x7FFFFFFF
#define seed 131
#define ll long long
#define ull unsigned ll
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1

struct node{
    int u,v,dis;
}edge[MAXN];
int father[1010],point[1010][2];
int n,m,ans,sum;
bool cmp(node x,node y){
    return x.dis<y.dis;
}
int find(int x){
    int t = x;
    while(t!=father[t]){
        t = father[t];
    }
    int k = x;
    while(k!=t){
        int temp = father[k];
        father[k] = t;
        k = temp;
    }
    return t;
}
void kruskal(){
    int i,j=0;
    for(i=1;i<=n;i++)   father[i] = i;
    for(i=0;i<m;i++){
        int a = find(edge[i].u);
        int b = find(edge[i].v);
        if(a!=b){
            father[a] = b;
            point[j][0] = edge[i].u;
            point[j][1] = edge[i].v;
            sum+=edge[i].dis;
            ans = edge[i].dis;
            j++;
            if(j>=n-1)  break;
        }
    }
}
int main(){
    int i,j;
    while(scanf("%d%d",&n,&m)!=EOF){
        sum = 0;
        for(i=0;i<m;i++){
            scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].dis);
        }
        sort(edge,edge+m,cmp);
        kruskal();
        printf("%d\n%d\n",ans,n-1);
        for(i=0;i<n-1;i++){
            printf("%d %d\n",point[i][0],point[i][1]);
        }
    }
    return 0;
}

抱歉!评论已关闭.