BZOJ1601 [Usaco2008 Oct]灌水

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ1601 [Usaco2008 Oct]灌水相关的知识,希望对你有一定的参考价值。

【算法】最小生成树(经典建模)

【题解】http://blog.csdn.net/wbysr/article/details/17793121

技术分享
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=310,maxm=100000,s=305;
int first[maxn],n,tot,fa[maxn];
struct edges{int from,u,v,p;}e[maxm];
void insert(int u,int v,int p)
{tot++;e[tot].u=u;e[tot].v=v;e[tot].p=p;e[tot].from=first[u];first[u]=tot;}
bool cmp(edges a,edges b)
{return a.p<b.p;}
int getfa(int x)
{return fa[x]==x?x:fa[x]=getfa(fa[x]);}
int main()
{
    scanf("%d",&n);
    int rd;
    for(int i=1;i<=n;i++)
     {
         scanf("%d",&rd);
         insert(s,i,rd);
         insert(i,s,rd);
     }
    for(int i=1;i<=n;i++)
     {
         for(int j=1;j<=n;j++)
           {
              scanf("%d",&rd);
              if(i!=j)insert(i,j,rd);
           }
     }
    sort(e+1,e+tot+1,cmp);    
    for(int i=1;i<=n;i++)fa[i]=i;fa[s]=s;
    int ans=0,cnt=0;
    for(int i=1;i<=tot;i++)
     if(getfa(e[i].u)!=getfa(e[i].v))
      {
//          printf("u=%d v=%d\\n",e[i].u,e[i].v);
          fa[fa[e[i].u]]=fa[e[i].v];
          ans+=e[i].p;cnt++;
          if(cnt==n)break;
      }
    printf("%d",ans);
    return 0;
}
View Code

 

以上是关于BZOJ1601 [Usaco2008 Oct]灌水的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ——1601: [Usaco2008 Oct]灌水

BZOJ1601 [Usaco2008 Oct]灌水

Bzoj1601 [Usaco2008 Oct]灌水

bzoj1601: [Usaco2008 Oct]灌水

BZOJ1601: [Usaco2008 Oct]灌水

BZOJ 1601 USACO 2008 Oct. 灌水