记录编号 545798 评测结果 AAAAAAAAAAAEEEEEEEEEEEEEE
题目名称 [NOIP 2018]保卫王国 最终得分 44
用户昵称 GravatarShallowDream雨梨 是否通过 未通过
代码语言 C++ 运行时间 2.649 s
提交时间 2019-11-01 21:23:01 内存使用 13.73 MiB
显示代码纯文本
    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=2005;
    const int inf=100000000;
    int f[maxn][3],b[maxn],head[maxn],tot;
    struct edge{int to,next;}a[maxn*2];
	void add(int x,int y){
	a[++tot].to=y;
	a[tot].next=head[x];
	head[x]=tot;}
	
	void sjm(int x,int fa){
	f[x][1]+=b[x];
	for(int i=head[x];i;i=a[i].next){
	int to=a[i].to;
	if(to==fa)continue;
	sjm(to,x);
	f[x][0]+=f[to][1];
	f[x][1]+=min(f[to][0],f[to][1]);}}
    int main(){
    freopen("2018defense.in","r",stdin);
    freopen("2018defense.out","w",stdout);
    int n,m,q,w,e,r;
    string useless;
    cin>>n>>m;
    cin>>useless; 
    for(int i=1;i<=n;i++)cin>>b[i];
    for(int i=1;i<n;i++){
	cin>>q>>w;
    add(q,w);add(w,q);}
    for(int i=1;i<=m;i++){
    cin>>q>>w>>e>>r;
    memset(f,0,sizeof(f));
    f[q][1-w]=f[e][1-r]=inf;
    sjm(1,0);
    int ans=min(f[1][0],f[1][1]);
    if(ans>=inf)cout<<-1;
	else cout<<ans<<endl;
    }
	return 0;
	}