删点游戏
这题是个贪心题,我们发现每条边最后一定会被删除,但关键是删除时贡献的价值是哪个点的价值(即将点权转为边权考虑,因为经过一条边的价值只会是左右点的价值)
我们可以转换
贪心证毕
接下来就排序一下就做完了
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int n,m;
struct edge{
int v,link;
}q[N*2];
int head[N],cnt=0;
void put(int x,int y){
q[++cnt].v=y;
q[cnt].link=head[x];
head[x]=cnt;
}
typedef long long ll;
ll w[N],ans=0;
struct node{
int val,id;
}in[N];
bool cmp(node x,node y){
return x.val>y.val;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){scanf("%d",&in[i].val),in[i].id=i;}
for(int i=1;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
put(u,v);put(v,u);
w[u]+=in[v].val;
w[v]+=in[u].val;
}
sort(in+1,in+n+1,cmp);
for(int i=1;i<=n;i++){
int idd=in[i].id;
ans+=w[idd];
for(int j=head[idd];j;j=q[j].link){
int v=q[j].v;
w[v]-=in[i].val;
}
}
printf("%lld",ans);//lld
}