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; }
以上是关于BZOJ1601 [Usaco2008 Oct]灌水的主要内容,如果未能解决你的问题,请参考以下文章