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;
    }
    
    
    
  • 相关阅读:
    数据库连接池
    JDBC事务
    oracle 11g
    python自动化办公1-os模块学习
    python模块学习1
    requests-post请求
    linux学习二-目录文件相关命令
    Linux学习一常见的7个命令及命令的信息查看
    python-文件操作
    异常以及异常处理
  • 原文地址:https://www.cnblogs.com/NaCl/p/9580118.html
Copyright © 2011-2022 走看看