神秘Unkown error
查看原帖
神秘Unkown error
807926
Coding_Zzh楼主2023/6/10 10:27

大号被禁言了 @ZAIJIANL

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<vector>
#define int long long
using namespace std;
const int MAXN = 5e6+10;
struct edge
{
	int u, v, w;
} e[MAXN << 1]; 
int x[MAXN], y[MAXN], c[MAXN], k[MAXN], f[MAXN], cnt, ans, num;
int p[MAXN], q[MAXN], tot;
vector<int> g[MAXN];
int a[MAXN], cnt1;
int find(int x)
{
	if(f[x] == x) return x;
	else return f[x] = find(f[x]);
}
int n;
int dis(int x1, int y1, int x2, int y2)
{
	return (abs(x1-x2) + abs(y1-y2));
}
void add_edge(int u, int v, int w)
{
	e[++cnt].u = u, e[cnt].v = v, e[cnt].w = w;
}
bool cmp(edge a, edge b)
{
	return a.w < b.w;
}
signed main()
{
	cin >> n;
	for(int i=1;i<=n;i++) cin >> x[i] >> y[i];
	for(int i=1;i<=n;i++) cin >> c[i];
	for(int i=1;i<=n;i++) cin >> k[i];
	for(int i=1;i<=n;i++) add_edge(0, i, c[i]);//建虚点 
	for(int i=1;i<=n;i++) 
		for(int j=1;j<=n;j++)
			add_edge(i, j, (llabs(x[i]-x[j])+llabs(y[i]-y[j]))*(k[i]+k[j]));
	sort(e, e+1+cnt, cmp);
	for(int i=1;i<=n;i++) f[i] = i;
	for(int i=1;i<=cnt;i++)
	{
		int u = e[i].u, v = e[i].v, w = e[i].w;
		int x = find(u), y = find(v);
		if(x != y) 
		{
			f[x] = y, ans += w;
			if(u == 0) a[++cnt1] = v;//建立发电站
			else p[++tot] = v, q[tot] = u;
			if(++num == n) break;
		}
	}
	cout << ans << endl << cnt1 << endl;
	for(int i=1;i<=cnt1;i++) cout << a[i] << " ";
	cout << endl << tot << endl;
	for(int i=1;i<=tot;i++) cout << p[i] << " " << q[i] << endl;
	return 0;
}
2023/6/10 10:27
加载中...