1 solutions

  • 0
    @ 2025-12-10 21:46:05
    #include<bits/stdc++.h>
    using namespace std;
    #define  int long long
    struct edge {
    	int st, ed, wei;
    
    
    } e[1200005];
    
    int p[10025];
    edge alle[1000005];
    int rs[11];
    bool cmp(edge a, edge b) {
    	return a.wei < b.wei;
    }
    int find(int x) {
    	if (x == p[x])return p[x];
    	return p[x] = find(p[x]);
    
    }
    
    
    signed main() {
    //	freopen("road2.in","r",stdin);
    	int n, m, k;
    	cin >> n >> m >> k;
    	for (int i = 1; i <= n + k; i++) {
    		p[i] = i;
    	}
    	for (int i = 1; i <= m; i++) {
    
    		cin >> e[i].st >> e[i].ed >> e[i].wei;
    	}
    
    	sort(e + 1, e + m + 1, cmp);
    	int po = 1;
    	for (int i = 1; i <= k; i++) {
    
    		cin >> rs[i];
    		for (int ii = 1; ii <= n; ii++) {
    			cin >> 	alle[po].wei ;
    			alle[po].st = i + n;
    			alle[po].ed = ii;
    			po++;
    		}
    
    	}
    	int total = 0;
    	int counter = 0;
    	for (int i = 1; i <= m; i++) {
    		int a = find(e[i].st);
    		int b = find(e[i].ed);
    		if (a == b)continue;
    		else {
    			p[b] = a;
    
    			total += e[i].wei;
    			counter++;
    			alle[po].st = e[i].st;
    			alle[po].ed = e[i].ed;
    			alle[po].wei = e[i].wei;
    			po++;
    			if (counter == n - 1) {
    				break;
    			}
    		}
    
    	}
    	if (k == 0) {
    		cout << total;
    		return 0;
    	}
    	int us[11];
    	int ttemp = 0, ma = total;
    	sort(alle + 1, alle + po, cmp);
    //	for (int i = 1; i <= po; i++) {
    	//	cout << alle[i].st << " " << alle[i].ed << " " << alle[i].wei << endl;
    
    //	}
    	for (int i = 1; i < (1 << k); i++) {
    		ttemp = 0;
    		int tz = i;
    		int cc = n, counter = 0;
    		for(int j=1;j<=k;j++)us[j]=0;
    		for (int j = 1; j <= k; j++) {
    			if ((tz >> (j - 1)) & 1) {
    				ttemp += rs[j];
    				us[j] = 1;
    				cc++;
    			}
    		}
    	
    		for (int ii = 1; ii <= n + k; ii++) {
    			p[ii] = ii;
    		}
    		for (int zz = 1; zz < po; zz++) {
    			if(alle[zz].st>n&&us[alle[zz].st-n] == 0){ continue;
    			}
    			//if(alle[zz].st>n&&us[alle[zz].st-n] == 1)	cout <<us[alle[zz].st-n];
    			int a = find(alle[zz].st);
    			int b = find(alle[zz].ed);
    		//	cout << a << " " << b << " " << alle[zz].st << " " << alle[zz].ed <<" "<<ttemp<< endl;
    			if (a == b)continue;
    			else {
    				p[b] = a;
    				ttemp += alle[zz].wei;
    
    				counter++;
    				if (counter == cc - 1) {
    				//	cout << total <<" "<< ttemp << endl;
    					ma = min(ma, ttemp);
    					break;
    				}
    			}
    
    		}
    
    	}
    	cout << ma;
    }
    
    • 1

    Information

    ID
    505
    Time
    2000ms
    Memory
    512MiB
    Difficulty
    10
    Tags
    (None)
    # Submissions
    2
    Accepted
    1
    Uploaded By