标签:des style blog http io ar color os sp
Description
Input
Output
Sample Input
4 0 4 9 21 4 0 8 17 9 8 0 16 21 17 16 0
Sample Output
28
裸最小生成树 可以用kruskal和prim来完成
kruskal
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; int n,coun; struct road { int f,t; int w; }; road vil[10000+10]; int fa[10000+10]; int cmp(road a ,road b) {return a.w<b.w;} int find(int x) { return fa[x]==x?x:fa[x]=find(fa[x]); } int Kruskal() { int ans=0; for(int i=0;i<coun;i++) fa[i]=i; sort(vil,vil+coun,cmp); for(int i=0;i<coun;i++) { int x=find(vil[i].f); int y=find(vil[i].t); if(x!=y) { fa[x]=y; ans+=vil[i].w; } } return ans; } int main() { int i,j; while(scanf("%d",&n)!=EOF) { coun=0; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { int waste; scanf("%d",&waste); if(i<j) { vil[coun].f=i; vil[coun].t=j; vil[coun].w=waste; coun++; } } } int ans=Kruskal(); printf("%d\n",ans); } return 0; }
prim
(网上贴来的代码 感觉明显kruskal比较简单粗暴啊)
#include<iostream> using namespace std; const int inf=100001; //无限大 int n; //农场数量 int dist[101][101]; int prim(void) { int s=1; int m=1; bool u[101]={false}; u[s]=true; int min_w; int prim_w=0; int point; int low_dis[101]; /*Initial*/ for(int i=1;i<=n;i++) low_dis[i]=inf; /*Prim Algorithm*/ while(true) { if(m==n) break; min_w=inf; for(int i=2;i<=n;i++) { if(!u[i] && low_dis[i]>dist[s][i]) low_dis[i] = dist[s][i]; if(!u[i] && min_w>low_dis[i]) { min_w = low_dis[i]; point=i; } } s=point; u[s]=true; prim_w+=min_w; m++; } return prim_w; } int main(void) { while(cin>>n) { /*Input*/ for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>dist[i][j]; /*Prim Algorithm & Output*/ cout<<prim()<<endl; } return 0; }
标签:des style blog http io ar color os sp
原文地址:http://www.cnblogs.com/sola1994/p/4134873.html