如果只有点或边的话,十分简单对吧,但是,现在都有。怎么办呢?
我们可以吧边权分在点上,怎么分,一般的想法就是对半分。但这样对不对呢?感性认识,由于是算分差,,如果两个人各选了一条边的一个端点,没有影响,不然的话,选了两个端点的人能超一个边权。那,这样就是对的。
排序后,轻松解决。
#include<bits/stdc++.h>
using namespace std;
int n,m;
int x,y,val;
int A[10001];
int Ans;
bool cmp(const int &A,const int &B)
{
return A>B;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&A[i]);
for(int i=1;i<=n;i++)A[i]<<=1;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&val);
A[x]+=val;
A[y]+=val;
}
sort(A+1,A+n+1,cmp);
for(int i=1;i<=n;i++)
{
if(i%2)Ans+=A[i];
else Ans-=A[i];
}
cout<<Ans/2;
return 0;
}

本文介绍了一种将边权分配到点上的算法,并通过排序解决特定问题的方法。该算法适用于处理包含点和边的数据结构问题,通过将边权分成两部分加到对应的端点上,进而计算最终得分。

739

被折叠的 条评论
为什么被折叠?



