1 条题解

  • 0
    @ 2023-3-13 12:11:53

    C++ :

    #include <bits/stdc++.h>
    using namespace std;
    
    struct node{
    	int x,y,len;	
    }; 
    
    
    int f[110];
    node a[10010];
    int t,k = 0;
    int n,q;
    
    int find(int x){
    	return x == f[x]?x:f[x] = find(f[x]);
    }
    
    void merge(int x,int y){
    	int fx = find(x);
    	int fy = find(y);
    	if(fx != fy){
    		f[fx] = fy;
    	}
    }
    
    bool cmp(node n1,node n2){
    	return n1.len < n2.len;
    }
    
    int main() {
    	cin>>n;
    	for(int i = 1;i <= n;i++){
    		for(int j = 1;j <= n;j++){
    			cin>>t;
    			if(i > j){
    				k++;
    				a[k].x = i;
    				a[k].y = j;
    				a[k].len = t;		
    			}		
    		}
    	}
    	
    	for(int i = 1;i <= n;i++){
    		f[i] = i;
    	} 
    	
    	sort(a+1,a+k+1,cmp);
    	cin>>q;
    	int x,y;
    	int c = 0;
    	for(int i = 1;i <= q;i++){
    		cin>>x>>y;
    		if(find(x) != find(y)){
    			c++;
    			merge(x,y);
    		}
    	}
    	
    	if(c >= n - 1){
    		cout<<0;
    		return 0;
    	}
    	
    	int s = 0;
    	for(int i = 1;i <= k;i++){
    		if(find(a[i].x) != find(a[i].y)){
    			merge(a[i].x,a[i].y);
    			c++;
    			s = s + a[i].len;
    		}
    		
    		if(c == n - 1){
    			cout<<s;
    			break;
    		}
    	}
    }
    
    
    

    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
    2125
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者