标签:
3 1 2 1 0 1 3 2 0 2 3 4 0 3 1 2 1 0 1 3 2 0 2 3 4 1 3 1 2 1 0 1 3 2 1 2 3 4 1 0
3 1 0
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1879
中文题:不解释了。
#include <iostream> using namespace std; const int INF=0x3f3f3f3f; int a[105][105]; int dis[105]; bool vis[105]; int n,m; void Prime() { for(int i=1; i<=n; i++) { dis[i]=a[1][i]; vis[i]=false; } vis[1]=true; dis[1]=0; int ans=0; for(int i=2; i<=n; i++) { int p=-1; int minn=INF; for(int j=1; j<=n; j++) { if(!vis[j]&&dis[j]<minn) minn=dis[p=j]; } 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]; } } cout<<ans<<endl; } int main() { while(cin>>n,n) { for(int i=0; i<n; i++) { for(int j=0; j<n; j++) if(i==j) a[i][j]=0; else a[i][j]=INF; } m=n*(n-1)/2; int x,y,z,f; for(int i=0; i<m; i++) { scanf("%d%d%d%d",&x,&y,&z,&f); if(f==1) a[x][y]=a[y][x]=0; else a[x][y]=a[y][x]=z; } Prime(); } return 0; }
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; int n,m; struct node { int s,e,w; } a[5000+5]; int fa[105]; int Find(int x) { if(fa[x]==x) return x; return fa[x]=Find(fa[x]); } bool cmp(node aa,node bb) { return aa.w<bb.w; } void 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) { fa[fx]=fy; ans+=a[i].w; } } cout<<ans<<endl; } int main() { while(cin>>n,n) { for(int i=1; i<=n; i++) fa[i]=i; int x,y,z,f; m=n*(n-1)/2; for(int i=0; i<m; i++) { scanf("%d%d%d%d",&x,&y,&z,&f); a[i].s=x; a[i].e=y; a[i].w=z; if(f) { int fx=Find(x); int fy=Find(y); if(fx!=fy) fa[fx]=fy; } } Kruskal(); } return 0; }
HDU 1389 继续畅通工程【最小生成树,Prime算法+Kruskal算法】
标签:
原文地址:http://blog.csdn.net/hurmishine/article/details/52133090