题意:
有n个人,其中有m对朋友关系,每个人都有一个unhappiness值,当这个人没有被邀请去派对时,就对答案贡献他的unhappiness值。每对被邀请的朋友都必须在派对带一个蛋糕,问派对中蛋糕数为偶数的最小unhappniess值。
思路:
显然,当m为偶数时,邀请所有人就好了,答案为0
当m为奇数时,我们需要在被邀请的人当中去掉一些人使得蛋糕个数为奇数
去掉一个人,蛋糕个数就会减少他所对应的度数
观察样例知,我们有两种选择:
1.去掉一个人,他的度数为奇数
2.去掉两个人,他们的度数加起来为偶数
一开始想错了,以为去掉一个人,蛋糕只会减少一个,显然不对
想错的地方还有:去掉两个人,对答案的unhappiness贡献值不一定会增加
Code:
const int mxn=1e5+10;
ll a[mxn],in[mxn],f[mxn][3];
void solve(){
ll n=llrd(),m=llrd(),x,y,ans=mnf,ans2=mnf;
rep(i,1,n){
a[i]=llrd();
in[i]=0;
}
rep(i,1,m){
x=llrd(),y=llrd();
f[i][0]=x,f[i][1]=y;
in[x]++,in[y]++;
}
if(m%2==0){
puts("0");
return;
}else{
rep(i,1,n){
if(in[i]%2==1) ans=min(ans,a[i]);
}
rep(i,1,m){
if(in[f[i][0]]%2==0&&in[f[i][1]]%2==0) ans2=min(ans2,a[f[i][0]]+a[f[i][1]]);
}
printf("%lld\n",min(ans,ans2));
}
}
总结:
1.这是道1300的graph题,由此可知,1300的题不一定难,而且graph题不一定要建图,也不一定要用到图论的一些算法,也许就是一些简单应用
2.善于观察样例,把自己的想法用样例模拟一遍之后,如果能过再去下笔,否则一下子写下来发现样例都没过,就GG了