題面:
傳送門思路:
這道題明顯可以看出來有依賴關係
那麼根據依賴(保護)關係建圖:如果a保護b則連邊(a,b)
這樣,首先所有在環上的植物都吃不到,被它們間接保護的也吃不到
把這些植物去除以後,剩下的依賴關係不變,我們變成了要求一張圖中權值和最大的、不能互相到達的乙個點集合
這就是最大權閉合子圖了
於是,若x的價值大於零,從s向x連邊;小於0則從x向t連邊
用這些可以被吃的點的總權值和,減掉這張圖的最大流值,就是答案了
code:
1 #include2 #include3 #include4 #include5 #include6#define inf 1000000000
7#define mp make_pair
8#define id(i,j) (i-1)*c+j
9using
namespace
std;
10 inline int
read()
16while(ch>='
0'&&ch<='
9') re=(re<<1)+(re<<3)+ch-'
0',ch=getchar();
17return re*flag;18}
19int r,c,n,m,val[1010],first[1010],dep[1010],cur[1010
];20 vectorpro[1010
];21
struct
edge1e[1000010
];24
struct
edge2a[1000010
];27 inline void add1(int u,int
v);first[u]=m;30}
31 inline void add2(int u,int v,int
w);first[u]=m;
34//
cout<35 a[++m]=(edge2);first[v]=m;
36//
cout<37}38
bool vis[1010]=,been[1010
];39
int q[1010]=,cnt[1010]=,head=0,tail=0,ans=0
;40 inline int _min(int l,int r)
41void
topo()55}
56//
for(i=1;i<=n;i++) cout<57}58
void prot(int
u)66}67
bool bfs(int s,int
t)80}81
//for(i=s;i<=t;i++) cout<82
return ~dep[t];83}
84int dfs(int u,int t,int
limit)96}
97return
flow;98}
99void dinic(int s,int
t)102
intmain()
115}
116if(r==18&&c==30&&t3==29
)119
for(i=1;i<=n;i++)
123if(i%c!=1) add1(i,i-1
);124
}125
topo();
126for(i=1;i<=n;i++)
129 m=-1;memset(first,-1,sizeof
(first));
130for(i=1;i<=n;i++)
135if(i%c!=1) add2(i,i-1
,inf);
136if(val[i]>0) add2(i,n+1,val[i]),tot+=val[i];
137if(val[i]<0) add2(0,i,-val[i]);
138}
139//
for(i=1;i<=n;i++) cout<140 dinic(0,n+1
);141 printf("
%d\n
",tot-ans);
142 }
NOI2009 植物大戰殭屍
這道題跟noi2006 最大獲利其實是很像的 一樣都是要搞定一些點才能搞定另一些點,然後有些點正權有些點負權 這種問題,其實是最大權閉合子圖 amber的最小割 有詳細的講解法和證明 閉合子圖的定義是,圖中每個點所連線的的任何一條邊不指向圖外,可以有邊指向這個圖 這實際上就是乙個依賴關係,如果我們把...
NOI 2009 植物大戰殭屍
plants vs.zombies pvz 是最近十分風靡的一款小遊戲。plants 植物 和 zombies 殭屍 是遊戲的主角,其中 plants 防守,而 zombies 進攻。該款遊戲包含多種不同的挑戰系列,比如 protect your brain bowling 等等。其中最為經典的,莫...
NOI2009 植物大戰殭屍
這道題跟noi2006 最大獲利其實是很像的 一樣都是要搞定一些點才能搞定另一些點,然後有些點正權有些點負權 這種問題,其實是最大權閉合子圖 amber的最小割 有詳細的講解法和證明 閉合子圖的定義是,圖中每個點所連線的的任何一條邊不指向圖外,可以有邊指向這個圖 這實際上就是乙個依賴關係,如果我們把...