标签: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; }
标签:space ini ima str 生成 struct ide contract oct
原文地址:http://www.cnblogs.com/onioncyc/p/6165744.html