zoukankan      html  css  js  c++  java
  • poj2377

    题目链接http://poj.org/problem?id=2377
    这题求得是最大生成树。如果不能联通的话就输出-1.
    我们用克鲁斯卡尔来做。要注意的一点就是在合并的时候要有序的合并。不能无序并,最后做完生成树之后,我们在判断一下是否n个点在同一个联通块上面。即他们的父亲节点一样。

    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    #define maxn 22000
    int f[maxn];
    int u[maxn],v[maxn],w[maxn],r[maxn];
    int n,m;
    bool cmp(int i,int j)
    {
         return w[i]>w[j];
     }
    int find(int x)
    {
         return f[x]==x?x:find(f[x]);
    }
     __int64 Kruskal()
     {
        __int64 ans=0;
        int count=0; 
          for(int i=1;i<=n;i++)
          {    
                f[i]=i;
          }
         for(int i=1;i<=m;i++)
         {
             r[i]=i;
         }
         sort(r+1,r+m+1,cmp);
        for(int i=1;i<=m;i++)
         {
             int e=r[i];
             int x=find(u[e]);
             int y=find(v[e]);
             if(x!=y)
            {
                ans+=w[e];
            if(x>y)
            {
                f[x]=y;
            }
            else
            f[y]=x;
            }   
         }
         for(int i=1;i<=n;i++)
         {
            if(find(i)!=1)
            return -1;
         }
         return ans;
     }
     int main()
     {
         while(~scanf("%d",&n))
         { 
            scanf("%d",&m); 
         for(int i=1;i<=m;i++)
         {
            scanf("%d %d %d",&u[i],&v[i],&w[i]);
         }
        __int64 ans= Kruskal();
        if(ans==-1)
        printf("-1
    ");
        else
        printf("%I64d
    ",ans);
    }
    return 0;
    }
    
    
    
  • 相关阅读:
    Scala-函数
    Scala--循环
    scala(一)
    拦截器filter
    Ajax实现分页二
    并发1
    泛型
    协议protocol
    结构体structure
    类的继承
  • 原文地址:https://www.cnblogs.com/NaCl/p/9580118.html
Copyright © 2011-2022 走看看