那位佬调一下啊,给一关注
查看原帖
那位佬调一下啊,给一关注
819682
Exile_Code楼主2023/11/5 12:46
#define  _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
#include <vector>
#include <set>
#include <map>
#include <unordered_map>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cstdlib>
#include <algorithm>
#include <list>
#include <string>
#include <cmath>
#include <bitset>
#include <stack>
#include <unordered_set>


#define ull				unsigned long long 
#define ll				long long
#define pii				pair<ll ,ll>
#define ft				first
#define sd				second
#define pr				pair
#define cy				cout<<"Yes"<<endl
#define cn				cout<<"No"<<endl
#define forn(i,n)		for(int (i)=0;(i)<(n);(i)++)   
#define forne(i,n)		for(int (i)=1;(i)<=(n);(i)++)
#define rforn(i,n)		for(int (i)=(n-1);(i)>=(0);(i)--)   
#define rforne(i,n)		for(int (i)=(n);(i)>=(1);(i)--)
#define sorta(a)		sort((a).begin(),(a).end())
#define sortcmp(a,cmp)	sort((a).begin(),(a).end(),cmp)
#define v				vector


const int inf = 0x4f4f4f4f;
const int N = 2e5 + 5;
ll t;

int fa[N];
int sz[N];

int find(int x) {
	return x == fa[x] ? x : fa[x] = find(fa[x]);
}
void un(int x, int y) {
	if (sz[x] < sz[y])
		swap(x, y);
	fa[y] = x;
	sz[x] += sz[y];
}
bool cmp(pr<pii, ll>& a, pr<pii, ll>& b) {
	return a.sd < b.sd;
}

void solve() {

	int a,b; cin >> a >> b;
	v<pr<pii,ll>>e(b*b);
	int cnt = 0;
	forne(i, b) {
		forne(j, b) {
			int ret; cin >> ret;
			e[cnt].ft.ft = i;
			e[cnt].ft.sd = j;
			if (ret&&ret<=2*a)
				e[cnt++].sd = ret;
			else
				e[cnt++].sd = a;
		}
	}
	forne(i, b)
		fa[i] = i,sz[i]=1;
	ll ans = 0;
	sort(e.begin(), e.end(), cmp);
	for (auto a : e) {
		int ret1 = a.ft.ft;
		int ret2 = a.ft.sd;
		ret1 = find(ret1);
		ret2 = find(ret2);
		if (ret1 == ret2 )
			continue;
		
		un(ret1, ret2);
		ans += a.sd;
	}
	int ret = fa[1];
	forne(i, b) {
		if (find(i)!=ret) {
			ans += a;
		}
	}
	cout << ans << endl;
}
int main() {

	//cin >> t;
	t = 1;
	while (t--)
		solve();

	return 0;
}





2023/11/5 12:46
加载中...