——————————————————————————————————————————————-
考前练习打打部分分
设置权值这个方法需要记住
————————————————————————————————————————————————————
PT:44
————
#include<bits/stdc++.h> using namespace std; const int inf=1000000000; char ch[5]; int n,m,head[101000],ne,a,b,c,d,val[101000],flg[101000],mp[2100][2100]; int f[101000][3]; struct node{int to,nxt;}eg[101000]; void adde(int u,int v) { eg[++ne].to=v; eg[ne].nxt=head[u]; head[u]=ne; } void dfs(int u,int fa) { for(int i=head[u];i;i=eg[i].nxt) if(eg[i].to!=fa) { dfs(eg[i].to,u); int v=eg[i].to; f[u][1]+=min(f[eg[i].to][1],f[eg[i].to][0]); f[u][0]+=f[eg[i].to][1]; } f[u][1]+=val[u]; } int main() { //freopen("defense.in","r",stdin); //freopen("defense.out","w",stdout); cin>>n>>m>>ch; for(int i=1;i<=n;i++)cin>>val[i]; for(int i=1;i<n;i++){cin>>a>>b;adde(a,b);adde(b,a);} while(m--) { memset(f,0,sizeof(f)); cin>>a>>b>>c>>d; int ans=0; int p1=val[a],p2=val[c]; if(!b)val[a]=inf; else {ans+=p1;val[a]=0;} if(!d)val[c]=inf; else {ans+=p2;val[c]=0; } dfs(1,0); if(min(f[1][1],f[1][0])>=inf)cout<<-1<<endl; else cout<<ans+min(f[1][1],f[1][0])<<endl; val[a]=p1; val[c]=p2; } }
原文地址:https://www.cnblogs.com/SFWR-YOU/p/11360363.html
时间: 2024-10-29 12:34:47