码迷,mamicode.com
首页 > 其他好文 > 详细

【BZOJ】1601 [Usaco2008 Oct]灌水

时间:2016-12-12 22:52:49      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:space   ini   ima   str   生成   struct   ide   contract   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

 

【BZOJ】1601 [Usaco2008 Oct]灌水

标签:space   ini   ima   str   生成   struct   ide   contract   oct   

原文地址:http://www.cnblogs.com/onioncyc/p/6165744.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!