删点游戏

删点游戏
这题是个贪心题,我们发现每条边最后一定会被删除,但关键是删除时贡献的价值是哪个点的价值(即将点权转为边权考虑,因为经过一条边的价值只会是左右点的价值)
原图
我们可以转换
转换
贪心证毕
接下来就排序一下就做完了

#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
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值