《最小生成树》hdoj 1863 kruskal+并查集 结构体 qsort 压缩路径

#include<stdio.h>
#include<stdlib.h>
struct node { int s,e,dist; }que[50000]; int pre[105]; int cmp(const void *a,const void *b) { return *(int *)a-*(int *)b; } int find(int x) { int r=x,i=x,j; while (r!=pre[r])
        r=pre[r]; while(pre[i]!=r) {
        j=pre[i];
        pre[i]=r;
        i=j; } return r; } void mix(int x,int y) { int fx,fy;
    fx=find(x);
    fy=find(y); if(fx!=fy)
        pre[fy]=fx; } int main() { int n,i,m,sum,cost; while(scanf("%d%d",&n,&m)&&n) { for(i=0;i<n;i++) {
            scanf("%d%d%d",&que[i].s,&que[i].e,&que[i].dist); }
        qsort(que,n,sizeof(que[0]),cmp); for(i=1;i<=m;i++)
            pre[i]=i;
        sum=0;
        cost=0; for(i=0;i<n;i++) { int a,b;
            a=find(que[i].s);
            b=find(que[i].e); if(a!=b) {
                cost+=que[i].dist;
                sum++;
                mix(a,b); } if(sum>=m-1) break; } if(sum<m-1)
            printf("?\n"); else
            printf("%d\n",cost); } return 0; }

你可能感兴趣的:(《最小生成树》hdoj 1863 kruskal+并查集 结构体 qsort 压缩路径)