1 条题解

  • 0
    @ 2025-2-14 21:30:05

    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
    上传者