1154. 【GDOI2003】購物 (Standard IO)

Description

GDOI商場推出優惠活動,以超低價出售若干種商品。但是,商場爲避免過分虧本,規定某些商品不能同時購買,而且每種超低價商品只能買一件。身爲顧客的你想獲得最大的實惠,也就是爭取節省最多的錢。經過仔細研究,發現商場出售的超低價商品中,不存在以下情況:n(n>=3)種商品C1,C2,…..,Cn,其中Ci,Ci+1是不能同時購買的(i=1,2…,n-1)並且C1, Cn也不能同時購買。編程計算可以節省的最大金額數。

Input

第一行兩個整數K,M(1<=K<=1000).其中K表示超低價商品數。K種商品的編號依次爲1,2,…,K。M表示不能同時購買的商品對數.接下來K行,第i行有一個整數Xi表示購買編號爲i的商品可以節省的金額(1<=Xi<=100).再接下來M行,每行兩個數A ,B,表示A和B不能同時購買,1<=A<=K,1<=B<=K,A<>B

Output

僅一個整數,表示能節省的最大金額數。

Sample Input

3 1 1 1 1 1 2

Sample Output

2

思路

把不能同時購買的物品相連,形成許多可樹,對於每個點,如果選擇這個點,那麼最大金額爲自身金額和每個子節點不選時的和,如果不選這個點,最大金額爲每個子節點選和不選的最大值。
選擇點i:f[i,1]:=f[i,1]+f[son1,0]+...+f[sonx,0];
不選擇點i:f[i,0]:=f[i,0]+max(f[son1,0],f[son1,1])+...
var
  s:array[1..1000,1..2] of longint;
  f:array[1..1000,1..1000] of boolean;
  a:array[1..1000] of boolean;
  n,m:longint;
function max(x,y:longint):longint;
begin
  if x>y then exit(x)
  else exit(y);
end;
procedure xxoo(x:longint);
var
  i:longint;
begin
  for i:=1 to n do
    begin
      if (f[x,i])and(a[i]) then
        begin
          a[i]:=false;
          xxoo(i);
          s[x,1]:=s[x,1]+s[i,0];
          s[x,0]:=s[x,0]+max(s[i,1],s[i,0]);
        end;
    end;
end;
var
  i,ans,x,y:longint;
begin
  readln(n,m);
  for i:=1 to n do
    begin
      readln(s[i,1]);
    end;
  for i:=1 to m do
    begin
      readln(x,y);
      f[x,y]:=true;
      f[y,x]:=true;
    end;
  fillchar(a,sizeof(a),true);
  for i:=1 to n do
    if a[i] then
      begin
        a[i]:=false;
        xxoo(i);
        ans:=ans+max(s[i,1],s[i,0]);
      end;
  writeln(ans);
end.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章