求助,fa数组改成maxm,为啥就过了
查看原帖
求助,fa数组改成maxm,为啥就过了
52896
livepan楼主2020/10/17 00:49
#include<bits/stdc++.h>
using namespace std;

const int maxn = 510*510;  
const int maxm = maxn*4;  
int fa[maxn], tot;  

struct Edge{
	int from, to,value;  
	bool operator < (const Edge b)const {
		return value < b.value;  
	}
}edge[maxm];

void init(int n){
	for(int i=1; i<=n; i++){
		fa[i]=i;  
	}
}

int find(int x){
	if(x != fa[x]){
		fa[x]=find(fa[x]);  
	}
	
	return fa[x];  
}


int num[maxn];  
int arr[maxn];  

int main(){
	int m, n;  
	cin >> m >> n;  
	for(int i=1; i<=m; i++){
		for(int j=1; j<=n; j++)
		{
			cin >> arr[i*n+j];  
		}
	}
	int sum =0;  
	for(int i=1; i<=m; i++){
		for(int j=1; j<=n; j++)
		{
			cin >> num[i*n+j];  
			if(num[i*n+j] == 1){
				sum++;  
			}
		}
	}
	if(sum <= 1){
		cout << 0;  
		return 0;  
	}
	
	for(int i=1; i<=m; i++){
		for(int j=1; j<=n; j++)
		{
			if(i-1>0){
				edge[++tot].to=(i-1)*n+j;  
				edge[tot].from=i*n+j;  
				edge[tot].value = abs(arr[i*n+j]-arr[(i-1)*n+j]);  
			}
			if(j-1>0){
				edge[++tot].to=i*n+j-1;  
				edge[tot].from=i*n+j;  
				edge[tot].value = abs(arr[i*n+j]-arr[i*n+j-1]);  
			}
			if(i+1<=m){
				edge[++tot].to=(i+1)*n+j;  
				edge[tot].from=i*n+j;  
				edge[tot].value = abs(arr[i*n+j]-arr[(i+1)*n+j]);  
			}
			if(j+1<=n){
				edge[++tot].to=i*n+j+1;  
				edge[tot].from=i*n+j;  
				edge[tot].value = abs(arr[i*n+j]-arr[i*n+j+1]);  
			}
		}
	}
	
	sort(edge+1, edge+1+tot);  
	init(maxn);  
	for(int i=1; i<=tot; i++){
		int u = find(edge[i].from);  
		int v = find(edge[i].to);  
		if(u != v){
			fa[u]=v;  
			num[v]+=num[u];  
			if(num[v] == sum){
				cout << edge[i].value <<endl; 
				return 0;  
			}
		}
		
	}
	
	
	return 0;  
}

2020/10/17 00:49
加载中...