并查集

柔情痞子 提交于 2019-12-06 12:16:58

排序问题

 

#include<iostream>
#include<cstdio>
#include<algorithm>
int pre[10001];
using namespace std;

struct node
{
    int x,y,z,w;
}q[10001];
int compare(node x,node y)
{
    return x.z<y.z;
}
int find(int x)
{
     int r=x;
    while(r!=pre[r])
        r=pre[r];
    return r;//可以不压缩
}
int main()
{
     int n;
    while(scanf("%d",&n)!=EOF&&n){
            int f1,f2,sum=0;
    for(int i=1;i<=n;i++)
    {
        pre[i]=i;
    }
    for(int i=1;i<=(n-1)*n/2;i++)
    {
        scanf("%d %d %d %d",&q[i].x,&q[i].y,&q[i].z,&q[i].w);
        if(q[i].w==1)
        {
            f1=find(q[i].x);
            f2=find(q[i].y);
            if(f1!=f2)
            {
                pre[f2]=f1;
            }
        }
    }
    sort(q+1,q+(n-1)*n/2+1,compare);//这里出了问题
    for(int i=1;i<=(n-1)*n/2;i++)
    {
            f1=find(q[i].x);
            f2=find(q[i].y);
            if(f1!=f2)
            {
                if(q[i].w==0)
                {
                pre[f2]=f1;
                sum+=q[i].z;
                }
            }
        }
     printf("%d\n",sum);
      }}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!