建议加强限制
查看原帖
建议加强限制
525223
敢问高姓大名楼主2024/8/7 11:48

这题标答应该是生成树

但是可以用普通dfs水过,总时间四秒多……

#include <bits/stdc++.h>
using namespace std;
int M,N,mky[505],ans,b[1005],vis;
struct node{
	int x,y;
}tr[1005];
vector <int> G[1005];
float jump[1005][1005];
void input(){
	cin >> M;
	for (int i = 1;i <= M;i++) cin >> mky[i];
	cin >> N;
	for (int i = 1;i <= N;i++) cin >> tr[i].x >> tr[i].y;
}
float dist(int x1,int y1,int x2,int y2){
	int dx = abs(x1 - x2),dy = abs(y1 - y2);
	float res = sqrt(dx * dx + dy * dy);
	return res;
} 
void Graph(node tr[]){
	for (int i = 1;i <= N;i++){
		for (int j = 1;j <= N;j++){
			if (i == j) continue;
			G[i].push_back(j),G[j].push_back(i);
			float w = dist(tr[i].x,tr[i].y,tr[j].x,tr[j].y);
			jump[i][j] = jump[j][i] = w;
		}
	}
}
void init(){
	memset(b,0,sizeof(b));
	vis = b[1] = 1;
}
void dfs(int idx,int can){
	for (int j = 0;j < G[idx].size();j++){
		int tx = G[idx][j];
		if (!b[tx] && can >= jump[idx][tx]){
			b[tx] = 1;
			vis++;
			dfs(tx,can);
		}
	}
}
void solve(){
	Graph(tr);
	for (int i = 1;i <= M;i++){
		init();
		dfs(1,mky[i]);
		if (vis == N) ans++;
	}
}
void output(){
	cout << ans;
}
int main(){
	input();
	solve();
	output();
	return 0;
} 
2024/8/7 11:48
加载中...