poj 1186 network --并查集

问题描述:输入N个整数,代表hubs的数量,输入M个数,M代表着关系,接下来是M行:每一行输出两个hubs和他们之间的长度

 输入:4 6

1     2     1

1     3     1

1      4      2

2      3      1

3      4       1

2      4        1

输出:

1(代表路径中的长度的最大值)

3(代表路径的总得长度)

1   2

1    3

2     4


不知道为什么总是wrong answer 

看别人被接受的代码:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
//并查集  F - Network
using namespace std;
struct node
{
    int v1; int v2;int l;
} s[15003];
int n,m,f[1003];char flag[15003];
bool cmp(node a,node b)//***
{
     if(a.l!=b.l) return a.l<b.l;
     if(a.v1!=b.v1) return a.v1<b.v1;
     return a.v2<b.v2;
}

int getf(int a)
{
    if(f[a]!=a)
        f[a]=getf(f[a]);
    return f[a];
}

int main()
{
    int t,i,mi,sum=0;
    scanf("%d%d",&n,&m);
    for(i=0;i<=n;i++)
        f[i]=i;
    for(t=0;t<m;t++)
        scanf("%d%d%d",&s[t].v1,&s[t].v2,&s[t].l);
    sort(s,s+m,cmp);
    for(i=0;i<m;i++)
    {
        int fa=getf(s[i].v1),fb=getf(s[i].v2);
        if(fa!=fb)
            flag[i]=1,f[fa]=fb,mi=s[i].l,sum+=1;
    }
    printf("%d\n%d\n",mi,sum);
    for(int j=0;j<m;j++)
        if(flag[j])  printf("%d %d\n",s[j].v1,s[j].v2);
    return 0;
}



自己写的代码

#include <iostream>
#include <stdio.h>
#define Maxn 1010
using namespace std;
int father[Maxn];
void make_set(int n)
{
	for(int i=0;i<n;i++)
	   father[i]=i;
}
int find_set(int x)
{
	if(father[x]==x)  return x;
	else
	   father[x]=find_set(father[x]);
	return father[x];
}
void unite(int x,int y)
{
	int fx=find_set(x);
	int fy=find_set(y);
	if(fx==fy)  return;
	else
	   father[fx]=fy;
}
void swap(int a[],int b[],int c[],int n)
//对长度按照从小到大的顺序排序,全部交换
{
	int t1,t2,t3;
	for(int i=1;i<n;i++)
	{
		for(int j=i+1;j<=n;j++)
		 { if(c[i]>c[j])
		   {
		  	   t1=a[i];a[i]=a[j];a[j]=t1;
		  	   t2=b[i];b[i]=b[j];b[j]=t2;
		  	   t3=c[i];c[i]=c[j];c[j]=t3;
		   }
	     }
	}
}
int main()
{
    int n,m,c,nn;
    int a[15003],b[15003],len[15003];
    int sum=0;
    bool flag[15003]={0};
    scanf("%d%d",&n,&m);
    nn=n;
	make_set(n);
    for(int i=1;i<=m;i++)
       scanf("%d%d%d",&a[i],&b[i],&len[i]);
	swap(a,b,len,m);
	for(int i=1;i<=m;i++)
	{
		//只需要把所有的数都加进去即可停止

		  if(find_set(a[i])!=find_set(b[i]))

		    {
		        if(n>0)
		    	{
		    	    sum+=len[i];
                             n--;
		           flag[i]=1;
				    unite(a[i],b[i]);
                          c=len[i];//每次的输入c都被替换,因为a[],b[],已经是排过顺序的
		    	}

			}

	}
	printf("%d\n%d\n",c,sum);
	for(int i=1;i<=m;i++)
	{
		if(flag[i]==1)
		   printf("%d %d\n",a[i],b[i]);
	}

    return 0;
}
但最终还是wrong answer 找不到原因


   


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值