noip模拟 市长选举
题目描述
利贝尔王国的卢安市因为前段时间的市长被捕事件,导致没有市长管理城市。他们需要一个新的市长。
竞选的人有两位。一位是诺曼,因支持旅游业而受到支持者的拥护。一位是波尔多斯,代表的是卢安的传统行业——渔业。但是他们的支持者在卢安的伦格兰德大桥吵起来了!
现在,他们每个人都与几个不同的人进行争吵。身为游击士的你,需要调解这场争斗。
参与吵架的共有n人,每个人都有一个倔强指数,第i个人的倔强指数是ai。你可以认为他们的每个争吵都只发生在两个人之间。你需要按照一定顺序把每一个人拉出这个“战场”。拉出一个人的代价是当前与他正在进行争吵的所有人的倔强指数之和,且拉出某个人以后,所有原来与他有关的吵架可以认为已经停止。
输入
第一行两个整数n m。
第二行n个整数,第i个整数表示ai。
下面m行每行两个整数pi pj,表示pi pj之间发生了一次争吵。
输出
一行一个整数,表示完成任务的最小代价。
样例输入
4 3 10 20 30 40 1 4 1 2 2 3
样例输出
40
提示
对于20%的数据,n<=9,m<=10。
对于50%的数据,n<=15,m<=20。
对于80%的数据,n<=1000,m<=1,000,000。
对于100%的数据,n<=1,000,000,m<=1,000,000。
对于100%的数据,0<=ai<=1000,输入保证没有人与自己吵架,保证数据随机生成。
这题就一句话贪心
而缺这题贪心贪的十分巧妙(正
我们可以将争吵的人构成一个图
我们发现这个图每条边最终都要被删去,才能完成任务
所以每条边的权值尽量小就可以了
那就是这条边所连两个点较小的点权值
最后把所有边权加一起就对了
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; int a[1000001]; int main() { int i,j; int n,m; long long ans=0; scanf("%d%d",&n,&m); for(i=1;i<=n;i++) { scanf("%d",&a[i]); } int x,y; for(i=1;i<=m;i++) { scanf("%d%d",&x,&y); ans+=min(a[x],a[y]); } cout<<ans; }