比赛 2024暑假C班集训C 评测结果 AWWWWWWWWW
题目名称 喵星人集会 最终得分 10
用户昵称 dream 运行时间 0.038 s
代码语言 C++ 内存使用 3.35 MiB
提交时间 2024-07-12 11:35:04
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
const int N=55;
int g[N][N],dis[N][N];
int n;
int aaa[N];
int cnt;
int read(){
	char c;
	int sum=0,f=1;
	c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-'){
			f=-1;
		}
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		sum=sum*10+c-'0';
		c=getchar();
	}
	return sum*f;
}
void floyd(){
	for(int k=1;k<=n;k++){
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
			}
		}
	}
}
int main(){
	freopen("party.in","r",stdin);
	freopen("party.out","w",stdout);
	n=read();
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			dis[i][j]=0x3f3f3f3f;
		}
	}
	for(int i=1;i<=n;i++){
		char c;
		cin>>c;
		if(c=='1'){
			aaa[++cnt]=i;
		}
	}
	for(int i=1;i<=n-1;i++){
		int x,y;
		x=read();
		y=read();
		g[x][y]=1;
		g[y][x]=1;
		dis[x][y]=1;
		dis[y][x]=1;
	}
	for(int i=1;i<=n;i++){
		dis[i][i]=0;
	}
	floyd();
	if(cnt==3){
		int res=1000000;
		for(int i=1;i<=n;i++){
			for(int j=1;j<=4;j++){
				for(int k=1;k<=4;k++){
					for(int q=1;q<=4;q++){
						if(j==k||j==q||k==q){
							continue;
						}
						int a,b,c;
						if(j==4){
							a=dis[aaa[1]][i];
						}
						if(k==4){
							b=dis[aaa[2]][i];
						}
						if(q==4){
							c=dis[aaa[3]][i];
						}
						for(int w=1;w<=n;w++){
							for(int e=1;e<=n;e++){
								if(g[i][w]==0||g[i][e]==0){
									continue;
								}
								if(w==e){
									continue;
								}
								if(a==4){
									b=dis[aaa[2]][w];
									c=dis[aaa[3]][e];
								}					
								if(b==4){
									a=dis[aaa[1]][w];
									c=dis[aaa[3]][e];
								}		
								if(c==4){
									a=dis[aaa[1]][w];
									b=dis[aaa[2]][e];
								}
								res=min(res,a+b+c);
							}
						}
					}
				}
			}
		}
		cout<<res;
	}
	else if(cnt==2){
		int res=1000000;
		for(int i=1;i<=n;i++){
			for(int j=1;j<=3;j++){
				for(int k=1;k<=3;k++){
					if(j==k){
						continue;
					}
					int a,b;
					if(j==3){
						a=dis[aaa[1]][i];
					}
					if(k==3){
						b=dis[aaa[2]][i];
					}
					for(int w=1;w<=n;w++){
						if(g[i][w]==0){
							continue;
						}
						if(j==3){
							b=dis[aaa[2]][w];
						}
						if(k==3){
							a=dis[aaa[1]][w];
						}
						res=min(res,a+b);
					}					
				}
			}
		}
		cout<<res;
	}
	else if(cnt==1){
		cout<<0;
	}
	return 0;
}