比赛 20191022轻松模拟测试 评测结果 WWWWWWWWWW
题目名称 原谅 最终得分 0
用户昵称 真香警告 运行时间 1.240 s
代码语言 C++ 内存使用 37.50 MiB
提交时间 2019-10-22 17:26:04
显示代码纯文本
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;

const int maxn=1000010;
int n,k;
int val[maxn];
int head[maxn];
int size=1;
int ans;
int tot;
bool vis[maxn];

priority_queue<int> q;

queue<int> p;

inline int read(){
	int w=1,x=0,ch=getchar();
	for(;ch<'0'||ch>'9';ch=getchar()) if(ch=='-') w=-1;
	for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
	return w*x;
}

struct edge{
	int to;
	int nxt;
}e[2*maxn];

void add(int x,int y){
	tot++;
	e[tot].to=y;
	e[tot].nxt=head[x];
	head[x]=tot;
}

void bfs(int x){
	p.push(x);
	vis[x]=1;
	q.pop();
	while(!p.empty()){
		int u=p.front();
		p.pop();
		for(register int i=head[u];i!=-1;i=e[i].nxt){
			int v=e[i].to;
			if(vis[v]) continue;
			if(val[v]<q.top()) continue;
			else{
				size++;
				vis[v]=1;
				p.push(v);
				q.pop();
			} 
		}
	}
}

int main(){
	freopen("green.in","r",stdin);
	freopen("green.out","w",stdout);
	n=read();
	k=read();
	for(register int i=0;i<n;i++){
		val[i]=read();
		q.push(val[i]);
	} 
	int x,y;
	int root=0;
	memset(head,-1,sizeof(head));
	for(register int i=1;i<n;i++){
		cin>>x>>y;
		if(val[root]<val[x]) root=x;
		if(val[root]<val[y]) root=y;
		add(x,y);
		add(y,x);
	}
	for(register int i=0;i<n;i++){
		if(val[root]==val[i]){
			memset(vis,0,sizeof(vis));
			size=1;
			bfs(i);
			ans=max(ans,size);
			while(!q.empty()) q.pop();
			while(!p.empty()) p.pop(); 
			for(register int j=0;j<n;j++) q.push(val[j]);
		} 
	}
	if(ans>k) cout<<k<<'\n';
	else cout<<ans<<'\n';
	return 0;
} 

/*

6 5
6 1 6 6 5 3
0 1
1 2
2 3
2 4
1 5

2

*/