标签:
3 0 990 692 990 0 179 692 179 0 1 1 2
179
直接套模板。
#include <cstdio> #include <cstring> #include <iostream> using namespace std; const int INF=0x3f3f3f3f; int a[105][105]; int dis[105]; bool vis[105]; int n; int Prime() { for(int i=1;i<=n;i++) { dis[i]=a[1][i]; vis[i]=false; } dis[1]=0; vis[1]=true; int ans=0; for(int i=1;i<n;i++) { int minn=INF; int p=-1; for(int j=1;j<=n;j++) { if(!vis[j]&&dis[j]<minn) minn=dis[p=j]; } //if(p==-1) //return -1; ans+=minn; vis[p]=true; for(int j=1;j<=n;j++) { if(!vis[j]&&dis[j]>a[p][j]) dis[j]=a[p][j]; } } return ans; } int main() { while(scanf("%d",&n)!=EOF) { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) scanf("%d",&a[i][j]); } int t,x,y; scanf("%d",&t); while(t--) { scanf("%d%d",&x,&y); a[x][y]=a[y][x]=0; } printf("%d\n",Prime()); } return 0; }
#include <cstdio> #include <algorithm> using namespace std; struct node { int s,e,w; }a[5000]; int n,m; int fa[105]; int Find(int x) { if(x==fa[x]) return x; return fa[x]=Find(fa[x]); } bool cmp(node a,node b) { return a.w<b.w; } int Kruskal() { sort(a,a+m,cmp); int ans=0; for(int i=0;i<m;i++) { int fx=Find(a[i].s); int fy=Find(a[i].e); if(fx!=fy) { ans+=a[i].w; fa[fx]=fy; } } return ans; } int main() { while(scanf("%d",&n)!=EOF) { m=0; int t; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { scanf("%d",&t); if(i<j) { a[m].s=i; a[m].e=j; a[m++].w=t; } } } for(int i=1;i<=n;i++) fa[i]=i; scanf("%d",&t); int x,y; while(t--) { scanf("%d%d",&x,&y); int fx=Find(x); int fy=Find(y); if(fx!=fy) fa[fx]=fy; } printf("%d\n",Kruskal()); } return 0; }
HDU 1102 Constructing Roads【简单最小生成树,Prime算法+Kruskal算法】
标签:
原文地址:http://blog.csdn.net/hurmishine/article/details/52122443