1 条题解
-
0
C++ :
//求某些点已经被连接的 最小生成树 #include <stack> #include <set> #include <vector> #include <math.h> #include <string.h> #include <algorithm> using namespace std; #define N 102 int map[N][N]; bool b[N]; int n; int Prim() { int i,sum=0,k; int t=n; int Min; memset(b,0,sizeof(b)); while(--t) { Min=10000; for(i=2;i<=n;i++) if(!b[i]&&Min>map[1][i]) { Min=map[1][i]; k=i; } // printf("%d ",Min); b[k]=1; sum+=Min; for(i=2;i<=n;i++) if(!b[i]&&map[k][i]<map[1][i]) map[1][i]=map[k][i]; } return sum; } int main() { // freopen("roads.in", "r", stdin); // freopen("roads.out", "w", stdout); int i,j,q; while(scanf("%d",&n)!=EOF) { for(i=1;i<=n;i++) for(j=1;j<=n;j++) scanf("%d",&map[i][j]); scanf("%d",&q); while(q--) { scanf("%d %d",&i,&j); map[i][j]=0; map[j][i]=0; } printf("%d\n",Prim()); } return 0; }
Pascal :
var ans,n,min,i,j,q,p,x,y:longint; a:array[0..101,0..101] of longint; d,f:array[0..101] of longint; v:array[0..101] of boolean; procedure prim; var i,j:longint; begin for i:=1 to n do d[i]:=maxlongint; d[1]:=0; for i:=1 to n do f[i]:=1; for i:=1 to n do begin min:=maxlongint; for j:=1 to n do if (v[j]=false) and (d[j]<min) then begin min:=d[j]; q:=j; end; ans:=ans+a[q,f[q]]; v[q]:=true; for j:=1 to n do if (q<>j) and (v[j]=false) and (a[q,j]>=0) and (a[q,j]<d[j]) then begin d[j]:=a[q,j]; f[j]:=q; end; end; end; begin readln(n); for i:=1 to n do for j:=1 to n do read(a[i,j]); readln(p); for i:=1 to p do begin read(x,y); a[x,y]:=0; a[y,x]:=0; end; prim; write(ans); end. AC
- 1
信息
- ID
- 934
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者