top1编程
← 返回题目
题解

【入门】道路规划

1 条题解

  • 0
    @ 2026-7-29 0:19:14
    #include<bits/stdc++.h>
    using namespace std;
    int dp[1001][1001],fa[1001];
    int n,cnt,ans,m;
    int find(int x){
        if(x!=fa[x]){
        	fa[x]=find(find(fa[x]));
    	}
        return fa[x];
    }
    struct no{
        int x,y,w;
    }s[10001];
    bool cmp(no a,no b){
        return a.w<b.w;
    }
    int main(){
        cin>>n;
        for(int i=1;i<=n;i++){
        	fa[i]=i;
    	}
        for(int i=1;i<=n;i++){
        	for(int j=1;j<=n;j++){
        		cin>>dp[i][j];
    		}
    	}    
        cin>>m;
        for(int i=0;i<m;i++){
            int a,b;
            cin>>a>>b;
            fa[find(a)]=find(b);
            dp[a][b]=dp[b][a]=0;
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(dp[i][j]){
                    s[cnt].x=i;
                    s[cnt].y=j;
                    s[cnt].w=dp[i][j];
                    cnt++;
                }
            }
        }
        sort(s,s+cnt,cmp);
        for(int i=0;i<cnt;i++){
            if(find(s[i].x)!=find(s[i].y)&&dp[s[i].x][s[i].y]){
                fa[find(s[i].x)]=s[i].y;
                ans+=s[i].w;
            }
        }
    	cout<<ans<<endl;
        return 0;
    }
    
    • 1