最短网络

农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场。当然,他需要你的帮助。约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其他农场。为了用最小的消费,他想铺设最短的光纤去连接所有的农场。你将得到一份各农场之间连接费用的列表,你必须找出能连接所有农场并所用光纤最短的方案。每两个农场间的距离不会超过100000

Input

第一行: 农场的个数,N(3<=N<=100)。
第二行..结尾: 后来的行包含了一个N*N的矩阵,表示每个农场之间的距离。理论上,他们是N行,每行由N个用空格分隔的数组成,实际上,他们限制在80个字符,因此,某些行会紧接着另一些行。当然,对角线将会是0,因为不会有线路从第i个农场到它本身。

Output

只有一个输出,其中包含连接到每个农场的光纤的最小长度。

Sample Input

4
0 4 9 21
4 0 8 17
9 8 0 16
21 17 16 0

Sample Output

28

题解:快排每一条边,依次用并查集判断该农场是否被加入,若联通则退出。

 
 
  • #include<iostream>
    using namespace std;
    int f[10009],a[10009],b[10009],re[109];
    int n;
    void qsort(int l,int r)
     {
     	if (l>r)return;
     	int i=l,j=r,k=f[(l+r)/2];
     	while(i<=j)
     	 {
     	 	while(f[i]<k)i++;
            while(f[j]>k)j--;
    		if(i<=j)
    		 {
    		 	int t=f[i];f[i]=f[j];f[j]=t;
    		 	    t=a[i];a[i]=a[j];a[j]=t;
    		 	    t=b[i];b[i]=b[j];b[j]=t;
    		 	    i++;j--;
    		 } 
     	 }
      qsort(l,j);
      qsort(i,r);	 
     }
    int find(int x)
    {
        int k=x;
        while(re[x]!=x) x=re[x];
        while(re[k]!=x)
        {
            int temp=re[k];
            re[k]=x;
            k=temp;
        }
        return x;
    }
    
    int main()
     {
     	int p=0;
     	cin>>n;
     	for(int i=1;i<=n;i++)
     	 for(int j=1;j<=n;j++)
     	  {
     	  	p++;
     	  	cin>>f[p];
     	  	a[p]=i;
     	  	b[p]=j;
          }
        qsort(1,p);
        int ans=0;
        for(int i=1;i<=n;i++)re[i]=i;
    	for(int i=1;i<=p;i++)
    	 {
     	int m=re[1];int check=0;
     	for(int i=1;i<=n;i++)
     	 if (re[i]!=m)check=1; 
    	 	if (check==0) 
    		  {
    		  	cout<<ans;
    		  	break;
    		  }
    		  
    	 	if(find(a[i])!=find(b[i])) 
    		 {
    		 	int k=find(re[b[i]]),l=re[a[i]];
    	 	  re[k]=l;
    	 	  ans+=f[i];
    	     }
    	 }  
     	  
     }
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值