您的位置:首页 > 其它

hdu1879(最小生成树)

2014-04-24 10:56 253 查看
此题用到kruskal算法,其中有用到了并查集

代码如下:

#include<iostream>
#include<algorithm>
#include<string>
#include<stack>
#include<queue>
#include<set>
#include<map>
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<time.h>
#include<math.h>

#define eps 1e-9
#define N  10000
#define pi acos(-1.0)
#define P system("pause")
using namespace std;
struct node
{
       int a,b;
       int cost,flag;       
}s
;
int f
;
bool cmp(node A,node B)
{
     if(A.flag != B.flag) return A.flag > B.flag;
     return A.cost < B.cost;     
}
int find(int x)
{
    return x == f[x] ? x:f[x] = find(f[x]);    
}
int kruskal(int n)
{
    int x,y,sum = 0;
    for(int i = 0; i < n; i++)
    {
          x = find(s[i].a);
          y = find(s[i].b);    
          if(x != y)
          {
               f[x] = y;
               if(s[i].flag == 0)
                    sum += s[i].cost;      
          }
    }    
    return sum;
}

int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
     int n;
     while(scanf("%d",&n) && n)
     {
          int i,j;
          int m = n*(n-1)/2;
          for(i = 0; i < m; i++)
                scanf("%d%d%d%d",&s[i].a,&s[i].b,&s[i].cost,&s[i].flag);  
          sort(s,s+m,cmp);              
          
          for(i = 1; i <= n; i++)
                f[i] = i;
                
          printf("%d\n",kruskal(m));      
     
     
                          
     }    

 //   P;                               
    return 0;    
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: